문제
1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아니다.
골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것이다. 이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다. 예를 들면, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7이다. 10000보다 작거나 같은 모든 짝수 n에 대한 골드바흐 파티션은 존재한다.
2보다 큰 짝수 n이 주어졌을 때, n의 골드바흐 파티션을 출력하는 프로그램을 작성하시오. 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력한다.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고 짝수 n이 주어진다.
출력
각 테스트 케이스에 대해서 주어진 n의 골드바흐 파티션을 출력한다. 출력하는 소수는 작은 것부터 먼저 출력하며, 공백으로 구분한다.
먼저 소수를 찾아 set에 담아서, N에서 소수를 뺀 값이 nums(set)에 있는지를 확인하였다.
처음에는 ArrayList로 구현하였는데, 이중 for문을 돌리니 시간 초과가 나서 set을 통해 구현하였다.
ArrayList의 contains는 O(n)이지만, set은 contains 메소드가 O(1)의 시간 복잡도를 가진다.
해당되는 수가 여러 개일 경우, 차이가 가장 작은 경우를 출력해야 하기 때문에 dis 변수에 두 수의 차이를 담아서 가장 작은 수를 출력하였다.
package boj0728;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class BOJ_9020_골드바흐의추측 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int t = 0; t < T; t++) {
int N = sc.nextInt();
int[] arr = new int[N + 1];
for (int i = 2; i < N; i++)
arr[i] = i; // i로 초기화
for (int i = 2; i < N; i++) {
if (arr[i] == 0) // 이미 지워진거면 pass
continue;
for (int j = i * 2; j < N; j += i)
// i의 배수를 찾아서 지움, 이때 i는 제외
arr[j] = 0;
}
Set<Integer> nums = new HashSet<>();
for (int i = 2; i < N; i++) {
if (arr[i] != 0)
nums.add(i);
} // 소수의 리스트들
String result = "";
int dis = N;
for (Integer num : nums) {
int other = N - num;
if (nums.contains(other) && dis > (Math.abs(num - other))) {
if (num < other) {
result = num + " " + other;
} else {
result = other + " " + num;
}
dis = Math.abs(num - other);
}
}
System.out.println(result);
}
}
}
'문제 풀이 > BOJ' 카테고리의 다른 글
[백준] 2447 - 별 찍기 10 (자바/Java): 재귀 (0) | 2022.07.29 |
---|---|
[백준] 17478 - 재귀함수가 뭔가요? (자바/Java): 재귀 Recursion (0) | 2022.07.29 |
[백준] 4948 - 베르트랑 공준 (자바/Java) (0) | 2022.07.28 |
[백준] 1929 - 소수 구하기 (자바/Java): 에라토스테네스의 체 (0) | 2022.07.28 |
[백준] 2581 - 소수 (자바/Java) (0) | 2022.07.28 |