백준 17103 - 골드바흐 파티션

Updated:

Java

17103 번 - 골드바흐 파티션

문제

  • 골드바흐의 추측: 2보다 큰 짝수는 두 소수의 합으로 나타낼 수 있다.
    짝수 N을 두 소수의 합으로 나타내는 표현을 골드바흐 파티션이라고 한다. 짝수 N이 주어졌을 때, 골드바흐 파티션의 개수를 구해보자. 두 소수의 순서만 다른 것은 같은 파티션이다.
    (2 < N ≤ 1,000,000)

접근 방법

에라토스테네스의 체를 이용하여 문제를 해결하였다.
각 소수를 인덱스로 하는 배열로 소수들을 나타낸다.
모든 소수를 구했다면, 2부터 n / 2까지 탐색한다.
i와 n-i의 합은 n이므로, i와 n-1 둘다 소수이면 골드바흐 파티션에 성립하므로 결과 값을 증가시킨다.

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n, MAX = 1000000;
	static long result;
	static boolean[] prime;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	int tc = stoi(br.readLine());
    	
    	prime = new boolean[MAX + 1];
    	Arrays.fill(prime, true); 	// true는 소수인 것으로 간주
    	int num = 0;
    	// ----------에라토스테네스의 체 시작----------
    	for(int i = 2; i <= MAX; i++) {
    		num = i;
    		if(!prime[i])		// 소수가 아니면 넘긴다
    			continue;
    		num += i;
    		while(num <= MAX) {	// 현재 소수의 배수 값들을 전부 소수가 아니다
    			prime[num] = false;
    			num += i;
    		}
    	}
    	prime[0] = false;
    	prime[1] = false;
    	// ----------에라토스테네스의 체 끝----------

    	for(int idx = 0; idx < tc; idx++) {
    		n = stoi(br.readLine());
    		result = 0;
    		
    		for(int i = 2; i <= n / 2; i++) {
    			// 현재 값과, n - 1값 모두 소수이면 결과 증가
    			if(prime[i]) {
	    			if(prime[n - i])
	    				result++;
    			}
    		}
    		System.out.println(result);
    	}
    	
    	br.close();
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

개선할 점

없습니다.