fee-fi-fo-fum
λ°˜μ‘ν˜•

문제

1742λ…„, λ…μΌμ˜ μ•„λ§ˆμΆ”μ–΄ μˆ˜ν•™κ°€ ν¬λ¦¬μŠ€ν‹°μ•ˆ κ³¨λ“œλ°”νλŠ” λ ˆμ˜¨ν•˜λ₯΄νŠΈ μ˜€μΌλŸ¬μ—κ²Œ λ‹€μŒκ³Ό 같은 좔츑을 μ œμ•ˆν•˜λŠ” νŽΈμ§€λ₯Ό λ³΄λƒˆλ‹€.

4보닀 큰 λͺ¨λ“  μ§μˆ˜λŠ” 두 ν™€μˆ˜ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄ 8은 3 + 5둜 λ‚˜νƒ€λ‚Ό 수 있고, 3κ³Ό 5λŠ” λͺ¨λ‘ ν™€μˆ˜μΈ μ†Œμˆ˜μ΄λ‹€. 또, 20 = 3 + 17 = 7 + 13, 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 이닀.

이 좔츑은 아직도 ν•΄κ²°λ˜μ§€ μ•Šμ€ λ¬Έμ œμ΄λ‹€.

백만 μ΄ν•˜μ˜ λͺ¨λ“  μ§μˆ˜μ— λŒ€ν•΄μ„œ, 이 좔츑을 κ²€μ¦ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

μž…λ ₯은 ν•˜λ‚˜ λ˜λŠ” κ·Έ μ΄μƒμ˜ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ κ°œμˆ˜λŠ” 100,000개λ₯Ό λ„˜μ§€ μ•ŠλŠ”λ‹€.

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” 짝수 μ •μˆ˜ n ν•˜λ‚˜λ‘œ 이루어져 μžˆλ‹€. (6 ≀ n ≀ 1000000)

μž…λ ₯의 λ§ˆμ§€λ§‰ μ€„μ—λŠ” 0이 ν•˜λ‚˜ μ£Όμ–΄μ§„λ‹€.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, n = a + b ν˜•νƒœλ‘œ 좜λ ₯ν•œλ‹€. μ΄λ•Œ, a와 bλŠ” ν™€μˆ˜ μ†Œμˆ˜μ΄λ‹€. μˆ«μžμ™€ μ—°μ‚°μžλŠ” 곡백 ν•˜λ‚˜λ‘œ κ΅¬λΆ„λ˜μ–΄μ Έ μžˆλ‹€. λ§Œμ•½, n을 λ§Œλ“€ 수 μžˆλŠ” 방법이 μ—¬λŸ¬ 가지라면, b-aκ°€ κ°€μž₯ 큰 것을 좜λ ₯ν•œλ‹€. 또, 두 ν™€μˆ˜ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ n을 λ‚˜νƒ€λ‚Ό 수 μ—†λŠ” κ²½μš°μ—λŠ” "Goldbach's conjecture is wrong."을 좜λ ₯ν•œλ‹€.

풀이

μ£Όμ–΄μ§„ 짝수λ₯Ό λ‘ν™€μˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λŠ” λ¬Έμ œμ΄λ‹€.
n = a + b ν˜•νƒœλ‘œ 좜λ ₯ν• λ•Œ, b - aκ°€ κ°€μž₯ 큰수λ₯Ό 좜λ ₯ν•˜λΌκ³  ν•˜μ˜€μœΌλ―€λ‘œ n을 1μ”© λΉΌκ°€λ©΄μ„œ μ†Œμˆ˜μΈ 경우λ₯Ό μ°Ύκ³ , μ†Œμˆ˜λΌλ©΄ n - b = a λ₯Ό 톡해 찾은 a도 μ†Œμˆ˜μΈμ§€ 확인해야 ν•œλ‹€.

μ½”λ“œ

첫번째 μ‹œλ„

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

public class κ³¨λ“œλ°”νμ˜μΆ”μΈ‘ {  

    public static StringBuilder sb = new StringBuilder();  

    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  

        while (true){  
            int n = Integer.parseInt(br.readLine());  
            if(n == 0) break;  
            goldbach(n);  
        }  

        System.out.println(sb);  
        br.close();  
    }  

    private static void goldbach(int n) {  

        for(int i=n; i>0; i--){  
            if(isPrime(i)){ // iκ°€ μ†Œμˆ˜μΈμ§€ 확인  
                int temp = n - i;  

                if(isPrime(temp)){ // n - i κ°€ μ†Œμˆ˜μΈμ§€ 확인  
                    sb.append(n).append(" = ").append(temp).append(" + ").append(i).append("\n"); // n = temp + i ν˜•νƒœ.  
                    return; //찾으면 κ³¨λ“œλ°”νμΆ”μΈ‘μ„ 끝내쀀닀.  
                }  
            }  
        }  
        sb.append("Goldbach's conjecture is wrong.");  
        return;  
    }  

    private static boolean isPrime(int index) {  
        if (index < 2) return false; // 2보닀 μž‘μœΌλ©΄ μ†Œμˆ˜κ°€ μ•„λ‹˜.  

        for (int i = 2; i * i <= index; i++) { //루트N 만 ν™•μΈν•˜λ©΄ λ˜λ‹ˆκΉŒ i*i둜 ν‘ΈλŠ”κ²ƒ.  
            if (index % i == 0) {  
                return false;  
            }  
        }  
        return true;  
    }  

}

μ‹€νŒ¨!
μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”κ²ƒκ°™μ•„μ„œ μ œμΆœν•΄λ³΄λ‹ˆ μ‹œκ°„μ΄ˆκ³Ό....γ…  μ–΄λ””κ°€ λ¬Έμ œμΈμ§€ 잘 λͺ¨λ₯΄κ² λ‹€.

λ‘λ²ˆμ§Έ μ‹œλ„

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

public class κ³¨λ“œλ°”νμ˜μΆ”μΈ‘ {  

    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  

        boolean[] bool = new boolean[1000001];  
        Arrays.fill(bool, true); //bool의 기본값을 true둜 λ³€κ²½.  

        for(int i=3; i<1000001; i++){  
            if(bool[i]){  
                for(int j=i+i; j<1000001; j=j+i){  
                    bool[j] = false; // 6 -false  9 , 12
                }  
            }  
        }  // ~체둜 κ±ΈλŸ¬λ…Όλ‹€. κ±ΈλŸ¬μ§„κ°’μ€ false

        while (true){  
            int n = Integer.parseInt(br.readLine());  
            if(n == 0) break;  

            int count = 0;  

            for(int i=3; i<1000001; i++){  
                if(bool[i] && bool[n-i]){  
                    System.out.println(n + " = " + i + " + " + (n-i));  
                    count = 1;  
                    break;  
                }  
            }  
            if(count == 0){  
                System.out.println("Goldbach's conjecture is wrong.");  
            }  
        }  
    }  
}

μ΄λ ‡κ²Œ μž‘μ„±ν•˜μ—¬ μ–΄λ–»κ²Œλ“  ν’€μ—ˆλ‹€. 쒀더 곡뢀가 ν•„μš”ν•˜λ‹€.

  1. μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 1000000κΉŒμ§€ 각 μ†Œμˆ˜ μ—¬λΆ€λ₯Ό κ΅¬ν•œ λ’€ μž…λ ₯받은 n이 0이 아닐 κ²½μš°μ— while문을 κ³„μ†ν•΄μ„œ μˆ˜ν–‰ν•œλ‹€.

  2. whileλ¬Έ λ‚΄λΆ€μ—μ„œλŠ” λ‹€μ‹œ for문을 톡해 ν•΄λ‹Ή 값이 μ°Έ(μ†Œμˆ˜)이고 n-i 번째 κ°’ λ˜ν•œ μ°Έ(μ†Œμˆ˜)이라면 λ¬Έμ œμ—μ„œ

    μš”κ΅¬ν•˜λŠ” 좜λ ₯ ν˜•μ‹μ— 맞게 값듀을 좜λ ₯ν•œλ‹€.

  3. λ˜ν•œ, count 값을 1둜 κ°±μ‹ ν•œ λ’€ count 값을 ν™•μΈν•˜μ—¬ κ·Έ 값이 0이라면 두 ν™€μˆ˜ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ n을 λ‚˜νƒ€λ‚Ό 수 μ—†κΈ° λ•Œλ¬Έμ— λ¬Έμ œμ—μ„œ μ£Όμ–΄μ§„ λ¬Έμžμ—΄μ„ 좜λ ₯ν•œλ‹€.

λ°˜μ‘ν˜•
profile

fee-fi-fo-fum

@hae02y

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!