728x90
문제
접근 방식
주어진 수 n까지의 소수를 모두 구한 후에 투 포인터를 사용해
첫 번째 소수부터 기준으로 합이 n과 같거나 커질 때까지 수들을 합해주고
합이 n과 같은 경우에는 카운트를 1 증가시켜 주면서
현재 기준점이 끝날 때마다 합에서 현재 값을 빼준 후에
다음 기준점으로 넘어가면서 계산해 주면 된다.
a = {2 3 5 7 11 13 17 23 29 31 37 41}
n이 41일 때를 예로 들면, 2 ~ 41까지의 소수는 위와 같다.
sum a[i] count
2 2 1
5 3 2
10 5 3
17 7 4
28 11 5
41 13 6 v
39 -2 5
56 17 6 x
53 -3 5
48 -5 4
41 -7 3 v
30 -11 2
53 23 3 x
40 -13 2
69 29 3 x
52 -17 2 x
29 -23 1
60 31 2 x
31 -29 1
68 37 2 x
37 -31 1
78 41 2 x
41 -37 1 v
위의 과정을 살펴보면 2 ~ 13까지의 소수를 연속으로 더했을 때 41이 되니
카운트를 1 증가시켜 준 후에 다음 소수인 3부터 시작하기 위해 누적합에서 2를 뺀 후에
41 이상이 될 때까지 더하면 되고, 이 과정들을 반복해 주면 된다.
풀이
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int size = 0;
int count = 0;
if (n == 1) {
System.out.println(count);
return;
}
boolean[] isPrime = new boolean[n + 1];
int[] arr = new int[n + 1];
int idx = 0;
for (int i = 2; i <= n; i++) {
if (!isPrime[i]) {
size++;
arr[idx++] = i;
for (int j = i * 2; j <= n; j+=i) {
isPrime[j] = true;
}
}
}
int end = 1;
int sum = arr[0];
for (int start = 0; start < size; start++) {
while (sum < n && end < size) {
sum += arr[end++];
}
if (sum == n) count++;
sum -= arr[start];
}
System.out.println(count);
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 22862번 : 가장 긴 짝수 연속한 부분 수열 (large) (0) | 2023.12.16 |
---|---|
[백준] 13144번 : List of Unique Numbers (0) | 2023.12.16 |
[백준] 1806번 : 부분합 (0) | 2023.12.15 |
[백준] 2230번 : 수 고르기 (0) | 2023.12.15 |
[백준] 20166번 : 문자열 지옥에 빠진 호석 (0) | 2023.12.15 |