본문 바로가기

Java/백준

[JAVA] 백준 17103 골드바흐 파티션

17103번: 골드바흐 파티션 (acmicpc.net)

 

17103번: 골드바흐 파티션

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

www.acmicpc.net

 

 

풀이 과정 

 

골드바흐의 추측

- 2보다 큰 짝수는 두 소수의 합으로 나타낼 수 있다 

 

골드바흐 파티션 

- 짝수 N을 두 소수의 합으로 나타내는 표현 

 

 

- 각 테스트 마다 모든 소수 배열을 생성할 필요 없음

- 입력 조건 중 가장 큰 숫자(10000000) 의 소수 조합을 생성 한 후 이용 

- n/2번씩 반복문을 돌면서 해당 숫자가 소수면서 n에서 소수를 뺀 값이 소수이면 count를 1씩 증가 

(두 소수의 순서만 다른 것은 같은 파티션으로 판단하기 때문에 for문은 0부터 n/2번까지 절반만 돌림)

 

 

정답 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class Main {
    
    public static void main(String[] args) throws IOException
    {
       
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
     
    	int max = 1000000;
    	//false이면 소수 
        boolean prime[] = new boolean[max+1];
        
        prime[0] = true;
        prime[1] = true;
        
        for(int i=2; i<= Math.sqrt(max); i++)
        {
        	if(prime[i]) continue;
        	for(int j=i*i; j<=max; j+=i)
        	{
        		prime[j]=true;
        	}
        }
        
        int num = Integer.parseInt(br.readLine());
        
        for(int i=0; i<num; i++)
        {
        	int count = 0;
        	int n = Integer.parseInt(br.readLine());
        	for(int j=2; j<=n/2; j++)
        	{
        		if(!prime[j] && !prime[n-j])
        			count++;
        	}
        	bw.write(count+"");
        	bw.newLine();
        }

        
        bw.flush();
        bw.close();
        
    }
}

 

 

'Java > 백준' 카테고리의 다른 글

[JAVA] 백준 7785 회사에 있는 사람  (1) 2024.02.12
[JAVA] 백준 14425 문자열 집합  (0) 2024.02.12
[JAVA] 백준 4948 베르트랑 공준  (1) 2024.02.10
[JAVA] 백준 1929 소수 구하기  (1) 2024.02.10
[JAVA] 백준 4134 다음 소수  (1) 2024.02.10