smooth waters run deep

1d-1c/BOJ

6588_골드바흐의 추측 (JAVA)

yeon_11 2020. 11. 22. 22:25
 

6588번: 골드바흐의 추측

각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰

www.acmicpc.net

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	static boolean flag = false;
    
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        boolean[] sosu = sosulist(1000000);
        
		while(true){
			flag = false;
			int num = Integer.parseInt(br.readLine());
			if(num==0)
				return;

			int temp = 0;
			for(int i=2; i<num; i++){
				if(!sosu[i]){
					temp = i;

					if(!sosu[num-i]){
						System.out.println(num+ " = "+temp+" + "+(num-temp));
						flag = true;
						break;
					}
				}
			}

			if(!flag)
				System.out.println("Goldbach's conjecture is wrong.");
		}
	}

	private static boolean[] sosulist(int num){
		boolean[] check = new boolean[num+1];
		for(int i=2; i*i<=num; i++){
			if(check[i])
				continue;
			for(int j=i+i; j<=num; j+=i){
				check[j] = true;
			}
		}

		return check;
	}
}

 

처음에는 num보다 작은 소수리스트 중에서 2개 뽑아 합이 num인 경우를 찾았다.

시간초과가 났고, 소수리스트를 모두 탐색하며 2개를 뽑는 것을 수정했다.

또 시간초과가 났고! num을 입력받기 전에 미리 num의 최대값으로 소수리스트를 구해놓았더니 통과했다.

 

 

www.acmicpc.net/board/view/44906

** 위 링크는 6588번 FAQ글이다. 시간초과가 났다면 무조건 참고하기!!

 

 

 

 

 

1. 에라토스테네스의 체를 이용하여 num의 최대값인 1000000까지의 소수를 모두 구한다.

   sosu[]=false이면 소수인 것!

 

2. 2~num-1까지 탐색하며 sosu[i]=false인 것을 찾는다 == 소수인 수 찾기

   만약 sosu[i]==false라면, num-i인 값도 소수인지를 확인한다.

 

3. sosu[i] = sosu[num-i] = false 라면, flag=true로 수정한다.

   만약 2번을 모두 끝낸 후에 flag=false라면, num을 두 개의 소수로 나타내지 못한다는 것이다.

  "Goldbach's conjecture is wrong." 메시지를 띄운다.

 

 

'1d-1c > BOJ' 카테고리의 다른 글

9095_1,2,3 더하기 (JAVA)  (0) 2020.11.24
14500_테트로미노 (JAVA)  (0) 2020.11.23
9613_GCD 합 (JAVA)  (0) 2020.11.22
1934_최소공배수 (JAVA)  (0) 2020.11.22
1652_누울 자리를 찾아라 (JAVA)  (0) 2020.11.19