알고리즘
[Java] 백준 1644번 소수의 연속합
J3SUNG
2023. 4. 6. 21:31
728x90
투포인터 문제입니다.
연속하는 소수의 합으로 해당하는 숫자를 만들 수 있는 경우의 수를 구해야합니다.
찾는 값과 같거나 낮은 수의 소수를 모두 구해줍니다.
left, right로 포인터를 주고 소수를 가리킵니다.
left부터 right까지 소수의 합이
찾는 값보다 작으면 right를 한칸 이동
찾는 값보다 크면 left를 한칸 이동
같으면 해당 경우의 수를 결과값에 추가하고 left, right를 한칸 이동
위의 과정을 반복하여 가능한 경우의 수를 출력해주었습니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static ArrayList<Integer> prime;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int ans = 0;
int n = Integer.parseInt(st.nextToken());
prime = new ArrayList<>();
for (int i = 2; i <= n; ++i) {
IsPrime(i);
}
if (n == 1) {
bw.write(ans + "");
bw.close();
return;
}
int left = 0;
int right = 0;
int value = prime.get(0);
while (left <= right) {
if (prime.size() <= left) {
break;
}
if (value < n) {
++right;
if (prime.size() <= right) {
break;
}
value += prime.get(right);
} else if (value > n) {
value -= prime.get(left);
++left;
} else if (value == n) {
++ans;
value -= prime.get(left);
++left;
++right;
if (prime.size() <= right) {
break;
}
value += prime.get(right);
}
}
bw.write(ans + "");
bw.close();
}
public static void IsPrime(int num) {
for (int i = 2; i <= Math.sqrt(num); ++i) {
if (num % i == 0) {
return;
}
}
prime.add(num);
}
}