반응형
https://www.acmicpc.net/problem/9020
골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것입니다.
그러한 두 소수를 골드바흐 파티션이라고 합니다.
아래는 골드바흐 파티션의 예제입니다.
- 8 = 3 + 5
- 10 = 5 + 5
- 16 = 5 + 11
골드바흐의 추측은 주어진 짝수가 n이라고 했을 때, n은 n보다 작은 두 소수 a, b의 합으로 나타낼 수 있습니다.
- n = a + b
이때 a > b 라면 n - a = b로 나타낼 수 있습니다.
따라서 주어진 짝수 n보다 작은 소수 중에 위의 식을 만족하는 a, b를 구하여 답을 구할 수 있습니다.
추가적으로 골드바흐 파티션이 여러개 일 경우 두 소수의 차이가 가장 작은 것을 출력합니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine()); //테스트 케이스의 개수
String answer = ""; // 골드바흐 파티션
for (int a = 0; a < T; a++) { // 테스트 케이스의 개수만큼 반복
int num = Integer.parseInt(br.readLine()); // 주어진 짝수 num
for (int i = num; i >= num / 2; i--) {
// num보다 작은 소수를 찾는다.
// 단, 두 소수의 차가 최소 지점인 0까지만 검사하면 되기 때문에 num/2 까지 검사한다.
if (check(i)) { // 소수 찾기
if (check(num - i)) { // 다른 한쪽의 소수 검사 (b = n - a)
answer = (num - i) + " " + i; // 둘다 소수일 경우 정답으로 출력
}
} else {
continue;
}
}
bw.write(answer + "\n");
}
br.close();
bw.flush();
bw.close();
}
public static boolean check(int num) {
if (num == 1) {
return false;
}
if (num == 2) {
return true;
}
for (int i = 2; i <= (int) Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준 알고리즘][자바] 3009번 : 네 번째 점 (0) | 2021.10.17 |
---|---|
[백준 알고리즘][자바] 1085번 : 직사각형에서 탈출 (0) | 2021.10.16 |
[백준 알고리즘][자바] 4948번 : 베르트랑 공준 (0) | 2021.08.03 |
[백준 알고리즘][자바] 1929번 : 소수 구하기와 소수(Prime Number) 판별법 알고리즘 (0) | 2021.08.03 |
[백준 알고리즘][자바] 11653번 : 소인수분해 (0) | 2021.08.02 |
댓글