-
백준 17103 골드바흐 파티션 (Java)알고리즘 타파/Baekjoon Online Judge 2020. 7. 10. 00:44반응형
URL
https://www.acmicpc.net/problem/17103
문제
-
골드바흐의 추측: 2보다 큰 짝수는 두 소수의 합으로 나타낼 수 있다.
짝수 N을 두 소수의 합으로 나타내는 표현을 골드바흐 파티션이라고 한다. 짝수 N이 주어졌을 때, 골드바흐 파티션의 개수를 구해보자.두 소수의 순서만 다른 것은 같은 파티션이다.
입력
첫째 줄에 테스트 케이스의 개수 T (1 ≤ T ≤ 100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 N은 짝수이고, 2 < N ≤ 1,000,000을 만족한다.
출력
각각의 테스트 케이스마다 골드바흐 파티션의 수를 출력한다.
생각
-
입력으로 6이 주어진다면 두 소수의 합은 {2, 4}, {3, 3}이다.
-
입력으로 10이 주어진다면 두 소수의 합은 {3, 7}, {5, 5}이다.
-
입력으로 12가 주어진다면 두 소수의 합은 {5, 7}, {7, 5}이나, 문제에서 두 소수의 순서만 다른 것은 같은 경우의 수라고 본다.
-
입력으로 주어진 수의 절반인 6까지 소수의 합이 성립하는 경우만 검사하면 중복된 경우의 수를 제외할 수 있다.
-
-
2부터 N까지의 소수를 빠르게 구할수 있는 방법은 "에라토스테네스의 체 (Sieve of Eratosthenes)"를 이용하는 방법이다.
(https://bellossimo.tistory.com/43?category=908154)
성공 코드
import java.util.Scanner; public class Main { public static boolean[] makeIsPrimeTable() { boolean[] isNotPrime = new boolean[1000001]; for (int i=2; i <= 1000000; i++) { if(! isNotPrime[i]) { for (int j=i*2; j<=1000000; j+=i) { isNotPrime[j] = true; } } } return isNotPrime; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); StringBuilder sb = new StringBuilder(); boolean[] isNotPrime; // 에라토스테네스의 체 세팅. isNotPrime = makeIsPrimeTable(); int testCastCount = scanner.nextInt(); for (int i=0; i<testCastCount; i++) { int number = scanner.nextInt(); int result = 0; for (int j=2; j<=number/2; j++) { if(! isNotPrime[j] && ! isNotPrime[number-j]) { result++; } } System.out.println(result); } } }
반응형'알고리즘 타파 > Baekjoon Online Judge' 카테고리의 다른 글
백준 2745 진법 변환 (Java) (0) 2020.07.13 백준 11005 진법 변환 2 (Java) (0) 2020.07.11 백준 2089 -2진수 (Java) (0) 2020.07.08 백준 1212 8진수 2진수 (Java) (0) 2020.07.07 백준 1373 2진수 8진수 (Java) (0) 2020.07.05 -