코딩테스트/백준

[Dev-Ping9] 백준 9020번 - 골드바흐의 추측 (Java) (N을 2개의 수의 합으로 표현하기)

DevPing9_ 2021. 11. 19. 15:15

 

# 문제 설명

  • 수학적 지식을 배워가는 좋은 문제다... (.. 😇)
  • 수에 대한 센스가 있느냐가 코딩시간과 수행시간을 압도적으로 단축시킨다.
  • 모든 경우의 수를 검색하여, 그중에 또 작은 경우를 찾는 바보가 저 말고 또 있으실까... ㅎ..ㅎ... (근데 통과는 됨..)

 

# 문제 풀이

  • 입력으로 들어오는 N은 짝수이며, 어떠한 짝수를 두수의 합으로 나타내는 모든 경우의 수를 찾는 방법은 해당 짝수를 2로 나눈 뒤, 한쪽에는 + a 다른 한 쪽에는 -a를 취하는 방법이다.

 

[*기초..기초..] N = (N/2 - a) + (N/2 + a)

 

  • 이 방법은 항상 만족하며, case를 빠트리는 경우도 없다.
  • 즉, 해당 로직으로 가장 빨리 발견하는 두 소수의 조합이 최소의 차를 가지는 골드바흐 파티션이다.

 

 

 

# 구현 코드 1  :  N = (N/2 - a) + (N/2 + a)

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

public class Main{

    static boolean isPrime(int num){
        if(num ==1 ) return false;
        for(int i=2;i<=Math.sqrt(num);i++){
            if(num%i==0) return false;
        }
        return true;
    }
    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        boolean[] primes = new boolean[10001];
        for(int i=2;i<=10000;i++){
            if(isPrime(i)){
                primes[i]=true;
            }
        }
        
        for(int i=0;i<T;i++){
            int n= Integer.parseInt(br.readLine());
            int large = n/2;
            int small = n/2;
            //짝수니까 n/2 + n/2 = n 이다.
            while(true){
                if(primes[large] && primes[small]) {
                    System.out.println(small+" "+large);
                    break;
                }
                large++;
                small--;
            }
        }
    }
}

 

# 구현코드 2 : 거의 dfs...

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

public class Main{

    static boolean isPrime(int num){
        if(num ==1 ) return false;
        for(int i=2;i<=Math.sqrt(num);i++){
            if(num%i==0) return false;
        }
        return true;
    }
    static int binarySearch(int[] arr, int start, int end, int target){
        int mid = (start+end)/2;
        
        if(start<=end){
            if(target==arr[mid]) return mid;
            else if(target>arr[mid]){
                binarySearch(arr, mid+1, end, target);
            }else{
                binarySearch(arr, start, mid-1, target);
            }
        }
        return -1;
    }
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        int[] primes = new int[10001];
        int idx=0;
        for(int i=2;i<=10000;i++){
            if(isPrime(i)){
                primes[idx++]= i;
            }
        }


        for(int i=0;i<T;i++){
            int n= Integer.parseInt(br.readLine());
            int firstSmallIdx = (-1)*Arrays.binarySearch(primes,0,idx, n) -2;
            // System.out.println("#FSI: "+ firstSmallIdx);
            int mapIdx=0;
            Map<Integer,List<Integer>> map = new HashMap<>();
            for(int j=firstSmallIdx; j>=0;j--){// n^2....
                List<Integer> list = new ArrayList<>();
                for(int k=0;k<=j;k++){
                    if(primes[j]+primes[k]>n) break;
                    else if(primes[j]+primes[k]==n){
                        list.add(primes[j]);
                        list.add(primes[k]);
                        map.put(mapIdx++,list);
                    }
                }
            }
            

            if(map.size()==1) {
                System.out.println(map.get(0).get(1)+ " "+ map.get(0).get(0));
            }
            else{
                int min = 100_000;
                int[] ans = new int[2];
                for(List<Integer> item : map.values()){
                    int diff = Math.abs(item.get(0)-item.get(1));
                    if(min>diff) {
                        min = diff;
                        ans[0]=item.get(1);
                        ans[1]=item.get(0);
                    } 
                }
                Arrays.sort(ans);
                System.out.println(ans[0]+" "+ans[1]);
            }
        }
    }
}
728x90