백준 - JAVA/기본 수학 2
[백준] 9020번 : 골드바흐의 추측 _ JAVA ( 주석 설명 )
wch_s
2023. 2. 3. 11:49
1번
→ '에라토스테네스의 채'를 이용한 골드바흐 파티션 구하기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static boolean[] prime = new boolean[10001]; //소수 : false, 합성수 : true
//전체 시간복잡도 : O(log(log(N))
//전체 공간복잡도 : O(N)
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //버퍼에 입력을 받아 입력을 처리하는 변수이다.
StringBuilder sb = new StringBuilder(); //출력값을 한번에 출력하기 위한 변수이다.
int T = Integer.parseInt(br.readLine()); //테스트케이스 개수를 입력받는다.
for(int i=0;i<T;++i){
int num = Integer.parseInt(br.readLine()); //골드바흐 파티션을 출력하기 위한 짝수를 입력받는다.
for(int j = 2;j<= Math.sqrt(num);++j){ //sqrt(num) 이후의 값은 불필요한 계산이다.
for(int k = j*j;k<=num;k+=j){ //'에라토스테네스의 채' 원리로 각 제곱수들 합성수 체크
prime[k]=true;
}
}
for(int a = num/2; a>=2; --a) { //두 소수의 차이가 가장 작은 것을 출력해야 하므로, 중앙수를 중심으로 체크
if (!prime[a])//a와 num-a 모두 소수이면 출력한다.
if (!prime[num - a]) {
sb.append(a).append(' ');
sb.append(num - a).append('\n');
break; //다음 소수들의 합을 출력 안하게 하기 위한 break문이다.
}
}
}
System.out.println(sb); //각 테스트케이스의 골드바흐 파티션을 출력한다.
}
}