[문제링크]

 

1644번: 소수의 연속합

첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)

www.acmicpc.net

 

0. 소수 구하기 + 연속합 문제

 

1. 소수 구하기 : 에라토스테네스의 체로 구하면서, 투포인터 사용시 편리하도록 ArrayList에 저장하였다

 

2. 누적합 구하기

  - N보다 같거나 커질때까지 더하며 진행

  - N보다 같거나 작아질때까지 빼며 진행

  - 원소가 하나만 남을 경우 2번 카운트되는 문제가 있어 prevFst를 두어 방지하였다

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = pint(br.readLine());

		boolean[]noPrime=new boolean[N+1];
		noPrime[0]=noPrime[1]=true;
		
		ArrayList<Integer>prime = new ArrayList<>();
		for (int i = 2; i < N+1; i++) {
			if(!noPrime[i]) {
				prime.add(i);
				for (int j = i; j < N+1; j+=i) {
					noPrime[j]=true;
				}
			}
		}
		
		int count=0;
		//두포인터
		int fst=0,end=0;
		long sum=0;
		while(fst<prime.size() && end<prime.size()) {
			while(sum<N && end<prime.size()) {
				sum+=prime.get(end++);
			}
			if(sum==N) {
				count++;
				if(end<prime.size())sum+=prime.get(end++);
			}
			
			int prevFst=fst;
			
			while(sum>N && fst<prime.size()) {
				sum-=prime.get(fst++);
			}
			if(prevFst!=fst && sum==N) {
				count++;
				if(fst<prime.size())sum-=prime.get(fst++);
			}
		}
		System.out.println(count);
	}
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

 

'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글

[백준] 1976 - 여행 가자  (0) 2021.04.28
[백준] 1717 - 집합의 표현  (0) 2021.04.28
[백준] 9252 - LCS 2  (0) 2021.04.28
[백준] 1937 - 욕심쟁이 판다  (0) 2021.04.22
[백준] 1865 - 웜홀  (0) 2021.04.22
[백준] 1261 - 알고스팟  (0) 2021.04.21
[백준] 2458 - 키 순서  (0) 2021.04.21

+ Recent posts