-
[9020번] 골드바흐의 추측 - Java알고리즘 연습 2021. 11. 17. 21:20
https://www.acmicpc.net/problem/9020
9020번: 골드바흐의 추측
1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아
www.acmicpc.net
1. 배운점
- 에라토스테네스의 체를 활용해 소수를 빠르게 구할 수 있다.
- 소수의 합을 반복문으로 하나하나 조회하면 비효율적이다(시간초과 발생)
2. 개선할 점
3. 궁금한 점
4. 풀이
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { // 에라토스테네스의 체를 활용해 소수 배열 반환 public static boolean [] primeSet() { boolean [] primeSet = new boolean[10001]; for(int i = 0; i < 10001; i++) { primeSet[i] = true; } primeSet[0] = primeSet[1] = false; for(int i = 2; i * i < primeSet.length; i++) { if(primeSet[i] == false) continue; for(int j = i * i; j < primeSet.length; j += i) { primeSet[j] = false; } } return primeSet; } public static void main(String[] args) throws NumberFormatException, IOException { // java.io.BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 테스트케이스 입력받기 int cases = Integer.parseInt(br.readLine()); // 테스트 케이스만큼 골드바흐 파티션 출력하기 boolean [] primeSet = primeSet(); for(int i = 0; i < cases; i++) { // 숫자 입력받기 int caseNum = Integer.parseInt(br.readLine()); // 입력된 숫자의 절반인 지점에서부터 시작(차이가 가장 작아야 하므로) int p1 = caseNum / 2; int p2 = caseNum - p1; while(true) { // P1, P2가 소수인지 확인해 맞으면 출력 if(primeSet[p1] == true && primeSet[p2] == true) { System.out.println(p1 + " " + p2); break; } // P1, P2가 소수가 아니라면 각각 1씩 감산, 가산 else { p1--; p2++; } } } } }
'알고리즘 연습' 카테고리의 다른 글
[2231번] 분해합 - Java (0) 2021.11.18 [4948번] 베르트랑 공준 - Java (0) 2021.11.17 [10809번] 알파벳 찾기 - Java (0) 2021.11.13 [2941번] 크로아티아 알파벳 - Java (0) 2021.11.13 [2581번] 소수 - Java (0) 2021.11.12