Skip to content

Commit 7d1d329

Browse files
committed
소수판별, 투포인터 / 소수판별은 기억해두기
1 parent 5683c2b commit 7d1d329

2 files changed

Lines changed: 106 additions & 0 deletions

File tree

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
2+
/* ************************************************************************** */
3+
/* */
4+
/* ::: ::: ::: */
5+
/* Problem Number: 1644 :+: :+: :+: */
6+
/* +:+ +:+ +:+ */
7+
/* By: thxogh1 <boj.kr/u/thxogh1> +#+ +#+ +#+ */
8+
/* +#+ +#+ +#+ */
9+
/* https://boj.kr/1644 #+# #+# #+# */
10+
/* Solved: 2025/05/06 14:30:23 by thxogh1 ### ### ##.kr */
11+
/* */
12+
/* ************************************************************************** */
13+
import java.io.BufferedReader;
14+
import java.io.InputStreamReader;
15+
import java.util.ArrayList;
16+
import java.util.Arrays;
17+
import java.util.List;
18+
19+
public class Main {
20+
public static boolean[] getPrimes(int n) {
21+
boolean[] isPrime = new boolean[n + 1];
22+
Arrays.fill(isPrime, true);
23+
isPrime[0] = isPrime[1] = false;
24+
25+
for (int i = 2; i * i <= n; i++) {
26+
if (!isPrime[i])
27+
continue;
28+
for (int j = i * i; j <= n; j += i) {
29+
isPrime[j] = false;
30+
}
31+
}
32+
return isPrime;
33+
}
34+
35+
public static void main(String[] args) throws Exception {
36+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
37+
int n = Integer.parseInt(br.readLine());
38+
39+
boolean[] isPrime = getPrimes(n);
40+
List<Integer> li = new ArrayList<>();
41+
42+
for (int i = 0; i < n + 1; i++) {
43+
if (isPrime[i])
44+
li.add(i);
45+
}
46+
int l = 0;
47+
int r = 1;
48+
if (li.size() == 1) {
49+
System.out.println(1);
50+
return;
51+
}
52+
int ans = 0;
53+
while (l <= r && r < li.size()) {
54+
// System.out.println(l + " " + r);
55+
int temp = 0;
56+
for (int i = l; i <= r; i++) {
57+
temp += li.get(i);
58+
}
59+
// System.out.println(temp);
60+
if (temp == n) {
61+
ans += 1;
62+
r += 1;
63+
} else if (temp > n) {
64+
l += 1;
65+
} else if (temp < n) {
66+
r += 1;
67+
}
68+
}
69+
System.out.println(ans);
70+
}
71+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# 1644번: 소수의 연속합 - <img src="https://static.solved.ac/tier_small/13.svg" style="height:20px" /> Gold III
2+
3+
<!-- performance -->
4+
5+
<!-- 문제 제출 후 깃허브에 푸시를 했을 때 제출한 코드의 성능이 입력될 공간입니다.-->
6+
7+
<!-- end -->
8+
9+
## 문제
10+
11+
[문제 링크](https://boj.kr/1644)
12+
13+
<p>하나 이상의 연속된 소수의 합으로 나타낼 수 있는 자연수들이 있다. 몇 가지 자연수의 예를 들어 보면 다음과 같다.</p>
14+
15+
<ul>
16+
<li>3 : 3 (한 가지)</li>
17+
<li>41 : 2+3+5+7+11+13 = 11+13+17 = 41 (세 가지)</li>
18+
<li>53 : 5+7+11+13+17 = 53 (두 가지)</li>
19+
</ul>
20+
21+
<p>하지만 연속된 소수의 합으로 나타낼 수 없는 자연수들도 있는데, 20이 그 예이다. 7+13을 계산하면 20이 되기는 하나 7과 13이 연속이 아니기에 적합한 표현이 아니다. 또한 한 소수는 반드시 한 번만 덧셈에 사용될 수 있기 때문에, 3+5+5+7과 같은 표현도 적합하지 않다.</p>
22+
23+
<p>자연수가 주어졌을 때, 이 자연수를 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 구하는 프로그램을 작성하시오.</p>
24+
25+
## 입력
26+
27+
<p>첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)</p>
28+
29+
## 출력
30+
31+
<p>첫째 줄에 자연수 N을 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 출력한다.</p>
32+
33+
## 소스코드
34+
35+
[소스코드 보기](Main.java)

0 commit comments

Comments
 (0)