정수론(수학)에서, 세 개의 소수 문제(3-primes problem) 는 다음과 같은 추측을 말한다.
'5보다 큰 임의의 홀수는 정확히 세 개의 소수들의 합으로 나타낼 수 있다. 물론 하나의 소수를 여러 번 더할 수도 있다.'
예를 들면,
7 = 2 + 2 + 3
11 = 2 + 2 + 7
25 = 7 + 7 + 11
5보다 큰 임의의 홀수를 입력받아서, 그 홀수가 어떻게 세 소수의 합으로 표현될 수 있는지 (또는 불가능한지) 알아보는 프로그램을 작성하시오.
첫째 줄에 T(Test Case의 수를 의미함)가 주어진다.
입력은 T개의 Test Case로 이루어진다.
각 Test Case는 하나의 정수 K (7 ≤ K < 1,000, K는 홀수)로 구성된다.
T줄에 걸쳐서, 각 줄에 K가 어떻게 세 소수의 합으로 표현되는지 출력해야 한다.
가능하다면 그 세 소수를 오름차순 정렬하여 출력하면 된다.
여러 개의 답이 가능하다면 그 중 하나만 출력하면 되고, 만약 불가능하다면 0을 출력한다.
3
7
11
25
2 2 3
2 2 7
5 7 13
※ 소수 list 반환하는 메소드는 소수 관련 문제를 많이 진행하였으므로 설명을 생략.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cases = Integer.parseInt(br.readLine());
int number;
ArrayList<Integer> prime;
for(int i=0; i<cases; i++) {
number = Integer.parseInt(br.readLine());
prime = getPrime(number);
boolean has = false;
for(int j=0; j<prime.size(); j++) {
for(int k=0; k<prime.size(); k++) {
for(int l=0; l<prime.size(); l++) {
if(prime.get(j)+prime.get(k)+prime.get(l)==number) {
System.out.println(prime.get(j)+ " " + prime.get(k) + " " +prime.get(l));
has = true;
break;
}
}
if(has) break;
}
if(has) break;
}
if(!has) {
System.out.println(0);
}
}
}
public static ArrayList<Integer> getPrime(int num) {
ArrayList<Integer> prime = new ArrayList<>();
boolean isPrime;
for(int i=2; i<num; i++) {
isPrime = true;
if(i==2) {
prime.add(i);
continue;
}
for(int j=2; j<i; j++) {
if(i%j==0) {
isPrime = false;
break;
}
}
if(isPrime) {
prime.add(i);
}
}
return prime;
}
}
이번 문제도 어렵지 않게 풀이할 수 있는 문제이다. 소수 list 반환으로 인해 코드 길이가 길긴했지만, 결과적으로는 지금까지 풀이한 문제들을 제대로 기억하고 있었다면 무난하게 풀 수 있던 문제.