알고리즘/백준 문제풀이

백준 [java 자바] 6588번 : 골드바흐의 추측

잔디🌿 2022. 8. 12. 00:07

언뜻 보기에는 쉬운 문제 같지만 사실 시간 때문에 고민을 좀 해야 하는 문제이다.

짝수인 수를 소수인 두 수의 합으로 나타내라는 문제이다.

import java.util.*;
import java.io.*;


class Main{
	static int check(int i) {
		int j;
		int ok = 0;
		for(j = 3;j*j<=i;j++) {
			
			if(i%j == 0) {
				ok = 1;
				break;
			}
		}
		return ok;
	}

 public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();
    while(true) {
    	int n = Integer.parseInt(br.readLine());
    	if(n == 0) break;
    	
    	
    	int i;
    	int j;
    	int k = 1;
    	int ok = 0;
    	int nn = 0;
    	for(i = 3;i<n;i+=2) {
    		
    			if(check(i) == 0) {
    				ok = 1;
    				if(check(n-i) == 0) break;
    			}
    		
    		
    	}
    	if(ok == 1) {
    		
			sb.append(n).append(" = ").append(i).append(" + ").append(n-i).append("\n");
    	}
    	
    	else sb.append("Goldbach's conjecture is wrong.\n");
    	
    	}
    	System.out.println(sb);
    	
    }
 }

우선 3부터 2씩 늘려가면서 소수인지 판단하고 n에서 그 수를 뺀 수도 소수인지 판단하게 하였다. 그리고 StringBuilder을 통해 출력 시간을 줄여주었다. 

 나는 옛날에 책으로 공부할 때 소수를 판단하는 함수를 for문을 해당 수의 루트만큼만 돌리면 된다는 걸 배운 적이 있지만 이걸 몰랐던 사람들은 많이 어려웠을 수도 있을 것 같다.

 

알아야 할 점: 

1. StringBuilder을 할 때 변수와 문자를 함께 써야할 경우 append를 사용하여 연결해준다.

2. 소수인지 모두 다 판단할필요가 없으니 그때그때 판단하기 위해 함수를 사용한다.

 

다른 사람의 코드와 다른 점 : 없다