Algorithm๐Ÿฅ‡

6588.๊ณจ๋“œ๋ฐ”ํ์˜์ถ”์ธก

hae02y 2023. 10. 19. 15:56
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•