mun dev

[백준] 17103 골드바흐 파티션 자바(Java) 본문

알고리즘/백준

[백준] 17103 골드바흐 파티션 자바(Java)

mndev 2023. 7. 21. 11:22

문제설명

  • 골드바흐의 추측: 2보다 큰 짝수는 두 소수의 합으로 나타낼 수 있다.

짝수 N을 두 소수의 합으로 나타내는 표현을 골드바흐 파티션이라고 한다. 짝수 N이 주어졌을 때, 골드바흐 파티션의 개수를 구해보자. 두 소수의 순서만 다른 것은 같은 파티션이다.

 

 

입력

첫째 줄에 테스트 케이스의 개수 T (1 ≤ T ≤ 100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 N은 짝수이고, 2 < N ≤ 1,000,000을 만족한다.

 

출력

첫째 줄에 테스트 케이스의 개수 T (1 ≤ T ≤ 100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 N은 짝수이고, 2 < N ≤ 1,000,000을 만족한다.

 

 

통과한 코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        boolean[] dec= new boolean[1000001];
        dec[0]=true;
        dec[1]=true;

        // 소수 구하기 = 소수 false
        for (int i = 2; i <= Math.sqrt(1000000); i++) {
            if (dec[i]) continue;
            for (int j = i*i; j < 1000001; j+=i) {
                dec[j] = true;
            }
        }

        //  a와 b가 N을 구성하는 소수라면, n/2이하까지만 탐색(절반 넘어가면 수가 겹치니)
        // 잎쪽에 있는 소수, 뒤쪽에 있는 소수 둘다 소수라면 골드바흐, n이 소수의 합이라면 카운트 증가
        int n=Integer.parseInt(br.readLine());
        for(int i=0; i<n; i++){
            int cnt=0;
            int tmp=Integer.parseInt(br.readLine());
            for(int j=2; j<=tmp/2; j++){
                if(!dec[j] && !dec[tmp-j]) cnt++;
            }
            System.out.println(cnt);
        }
    }
}