본문 바로가기
알고리즘/백준

백준 6588번 - 골드바흐의 추측 (Java 8)

by latissimus 2022. 3. 15.

https://www.acmicpc.net/problem/6588

 

6588번: 골드바흐의 추측

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

www.acmicpc.net

코드 :

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

public class Main {
    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        boolean[] prime = new boolean[1000001];


        prime[0] = true;
        prime[1] = true;

        for (int i = 2; i <= Math.sqrt(1000000); i++) {
            if(prime[i] == true){
                continue;
            }
            for (int j = i * i; j < prime.length; j += i) {
                prime[j] = true;
            }
        }
        //입력 값 0 아니면 계속 실행
        int num;
        boolean isGoldbachCorrect = false;
        while((num = Integer.parseInt(br.readLine())) != 0){

            // 홀수만 이므로 i+=2로 설정
            // 차가 가장 큰 수를 찾아야하므로, 양쪽 끝에서 합으로 나타낼 수 있는 수를 탐색한다.
            // 둘 다 소수일 경우 append후 탈출
            for (int i = 1; i <= num/2+1; i+=2) {
                int primeNum1 = i;
                int primeNum2 = num - i;
                if (!prime[primeNum1] && !prime[primeNum2]) {
                    sb.append(num).append(" = ").append(primeNum1).append(" + ").append(primeNum2).append("\n");
                    isGoldbachCorrect = true;
                    break;
                }
            }
            if(!isGoldbachCorrect){
                sb.delete(0, sb.length());
                sb.append("Goldbach's conjecture is wrong.");
                break;
            }
        }
        System.out.print(sb);
    }
}

9020번과 유사한 문제다. 제목 구분도 안돼 있다.

주의할 점은 한 케이스라도 일치하지 않으면, 골드바흐의 추측은 틀렸다고만 반환해야 한다.

댓글