๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm/Java][๋ฐฑ์ค€] 9020 ๊ณจ๋“œ๋ฐ”ํ์˜ ์ถ”์ธก

๋ฐ˜์‘ํ˜•

[BOJ] 9020 ๊ณจ๋“œ๋ฐ”ํ์˜ ์ถ”์ธก

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

๋ฌธ์ œ ์ ‘๊ทผ

์ง์ˆ˜ n์„ ๊ฐ€์žฅ ์ฐจ์ด๊ฐ€ ์ž‘์€ ๋‘ ์†Œ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ฒ˜์Œ์—๋Š” n๊นŒ์ง€ ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ๊ทธ ์ˆ˜์ค‘์—์„œ ํ•ฉ์„ ์ˆ˜ํ• ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๊ณ  ๋‚ด๊ฐ€ ์ผ๋Š”๋ฐ๋„ ๋‚ด๊ฐ€ ๋ชป์•Œ์•„๋ณด๋Š” ์ง€๊ฒฝ์ด์˜€๋‹ค... ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ์€ ๋ง‰ํ˜”๋‹ค
๊ทธ๋ž˜์„œ ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ 10000๊นŒ์ง€์˜ ์†Œ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ตฌํ–ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์€ ๊ฐ€์žฅ ์ฐจ์ด๊ฐ€ ์ž‘์€ ๋‘ ์†Œ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ num1์€ n/2๋ถ€ํ„ฐ 1์”ฉ ๊ฐ์†Œํ•˜๊ณ  num2๋Š” n- num1์œผ๋กœ ํ•ด์„œ num1,num2 ๋ชจ๋‘ ์†Œ์ˆ˜์ธ ์ฒซ๋ฒˆ์งธ ๊ฒฝ์šฐ๊ฐ€ ๋‹ต์ด์˜€๋‹ค.
์š”์•ฝํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
1.์—๋ผํ† ์Šค๋„ค์Šค์˜ ์ฒด๋กœ 10000๊นŒ์ง€ ์†Œ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ตฌํ•œ๋‹ค.
2.1์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ n/2๋ถ€ํ„ฐ 1์”ฉ ์ค„์—ฌ๊ฐ€๋ฉด์„œ num1, num2 ๋ชจ๋‘ ์†Œ์ˆ˜์ธ ๊ฒฝ์šฐ๋ฅผ ์ฐพ๋Š”๋‹ค.

Code

import java.util.Scanner;

public class BOJ9020 {
    static boolean[] isNotPrime = new boolean[10001];
    static int n;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        findPrime();
        while(T-- != 0){
            n = sc.nextInt();
            findAnswer(n);
        }
    }
    /**
     * ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋ฅผ ์ด์šฉํ•ด 10000๊นŒ์ง€ ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•ด isNotPrime์— ์ €์žฅํ•œ๋‹ค.
     * isNotPrime == true -> ์†Œ์ˆ˜ ์•„๋‹˜
     * isNotPrime == false -> ์†Œ์ˆ˜
     * */
    public static void findPrime(){
        for(int i = 2; i< isNotPrime.length; i++) {
            if(isNotPrime[i]) continue;
            for (int j = 2 * i; j < isNotPrime.length; j += i) {
                isNotPrime[j] = true;
            }
        }
    }
    /**
     * n/2๋ถ€ํ„ฐ 1์”ฉ ๊ฐ์†Œ์‹œํ‚ค๋ฉด์„œ 
     * num1,num2 ๋ชจ๋‘ ์†Œ์ˆ˜์ธ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์•„์„œ ์ถœ๋ ฅํ•œ๋‹ค.
     */
    public static void findAnswer(int n){
        for(int num1 = n/2; num1 > 0; num1--){
            int num2 = n - num1;
            if(!isNotPrime[num1] && !isNotPrime[num2]){
                System.out.println(num1+" "+num2);
                break;
            }
        }
    }
}

์–ด๋ ค์› ๋˜ ์  / ๋ฐฐ์šด ์  / ๋Š๋‚€ ์ 

boolean์„ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์„œ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด false์—ฌ์„œ ์ฒ˜์Œ์—๋Š” boolean isPrime์„ ์„ ์–ธํ–ˆ๋‹ค๊ฐ€ boolean isNotPrime์œผ๋กœ ๋ฐ”๊ฟจ๋‹ค.
์ „์—ญ๋ณ€์ˆ˜๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ์„ ๋•Œ ๊ธฐ๋ณธ๊ฐ’์€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, findPrime์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•„์„œ ๋ฌธ์ œ๋ฅผ ์ฐพ๋Š”๋ฐ ์ข€ ๊ฑธ๋ ธ๋‹ค.(์—๋ผํ† ์Šคํ…Œ๋„ค์Šค๊ฐ€ ์ž˜๋ชป๋œ ์ค„ ์•Œ์•˜๋‹ค....)

๋ฐ˜์‘ํ˜•