코딩/알고리즘

[알고리즘] 백준 골드바흐의 추측 6588번 JAVA

유어노우 2021. 1. 5. 23:50

2021/01/05 - [코딩/알고리즘] - [알고리즘] 백준 소수찾기 1978번 JAVA

 

[알고리즘] 백준 소수찾기 1978번 JAVA

요즘은 백준 문제집에서 code.plus 문제를 순차적으로 풀고있다 . 아직은 할만하다. 최적의 답인지는 모르겠다. import java.util.Scanner; public class Main_1978 { public static void main(String[] args) { i..

yourknow.tistory.com

 

시간 초과 뜸..

아무래도 primeNumber에서 반복횟수가 늘어나는 것 같다.

 

 

import java.util.Scanner;

public class Main_6588 {
    static int n=-1;//초기화
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int arry[] = new int[100000];
        int a=3,b;

        for(int i=0; n!=0; i++) {
            arry[i]=scanner.nextInt();
            if(arry[i]==0){
                n=i;
                break;
            }
        }


        for(int i=0; i<n; i++){
            b=arry[i]-a;
            while(true){
                if((primeNumber(a) == true && primeNumber(b) == true) ){
                    System.out.println(arry[i]+" = "+a+" + "+b);
                    break;
                }

                if(b-2>arry[i]/2) {
                    b-=2;
                    a=arry[i]-b;
                }
                else{
                    System.out.println("Goldbach's conjecture is wrong.");
                    break;
                }
            }
        }
    }
    
    public static boolean primeNumber(int a){
            int temp=a/2; // 나누는 수를 주어진 숫자/2 부터 시작
            while(temp!=0) {
                //나머지가 0인데 1로 나눴을 경우 소수이다.
                if(a%temp==0 && temp==1) return true;
                //나머지가 0인데 1이 아닐경우 소수가 아니기 때문에 다음수로 넘어간다.
                else if(a%temp==0) return false;
                temp--;
            }

            return false;
    }
}

 

primeNumber를 수정하고는 시간초과는 안떳는데 틀렸다고 나왔다..

 

문제는 a초기화가 제대로 안되었던 것이다.

 

for이 새로 시작하는 구문에서 백준에 나온 테스트케이스는 제대로 출력된다. 

마지막 42 = 5+37 로 나오기 때문에 

다음케이스의 a는 5로 시작하는 것

 

 

아래는 최종 답

 

변수 n은 사용하지 않아도 되어 삭제 하였다.

소수를 구하는 식은 검색하여 수정  

내가 사용한 방법은 시간복잡도가 n이고 

아래 방법은 루트n

import java.util.Scanner;

public class Main_6588 {
    static int n=-1;//초기화
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int arry[] = new int[100000];
        int a,b;
        
        for(int i=0; n!=0; i++) {
            arry[i]=scanner.nextInt();
            if(arry[i]==0){
                break;
            }
        }


        for(int i=0; arry[i]!=0; i++){
            a=3;
            b=arry[i]-a;
            while(true){
                if((primeNumber(a) == true && primeNumber(b) == true) ){
                    System.out.println(arry[i]+" = "+a+" + "+b);
                    break;
                }

                if(a+2<arry[i]/2) {
                    b-=2;
                    a=arry[i]-b;
                }
                else{
                    System.out.println("Goldbach's conjecture is wrong.");
                    break;
                }
            }
        }
    }
    
    public static boolean primeNumber(int num){
        for(int i=2; i*i<=num; i++){
            if(num % i == 0) return false;
        }
        return true;
    }
}