영원히 남는 기록, 재밌게 쓰자

백준 [17103] 골드바흐 파티션 (자바) 본문

Algorithm/백준

백준 [17103] 골드바흐 파티션 (자바)

youngjae-kim 2024. 5. 20. 14:23
728x90
반응형

문제

입력

첫째 줄에 테스트 케이스의 개수 T (1 ≤ T ≤ 100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 N은 짝수이고, 2 < N ≤ 1,000,000을 만족한다.

출력

각각의 테스트 케이스마다 골드바흐 파티션의 수를 출력한다.

풀이

  1. 소수 배열을 만들고 소수를 구한다. 소수를 구하는 방법은 에라토스테네스의 체를 활용한다.
  2. 정수 N에 대해서 소수를 뺀 나머지가 소수이면 두 소수의 합으로 나타낼 수 있으므로 카운트한다.

 

전체코드

package com.baekjoon.p17103;

import java.io.*;

public class Main {
    static boolean[] isPrime;
    static final int num = 1000001;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 소수 구하기
        isPrime = new boolean[num];

        for (int i = 2; i < num; i++) {
            isPrime[i] = true;
        }

        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (!isPrime[i])
                continue;

            for (int j = i * i; j < num; j += i) {
                isPrime[j] = false;
            }
        }

        StringBuilder sb = new StringBuilder();
        int T = Integer.parseInt(br.readLine());

        while (T-- > 0) {
            int N = Integer.parseInt(br.readLine());
            int cnt = 0; // 합이 짝수이면 카운트

            // 절반 이상을 넘겨서 탐색을 하면 중복되는 수열이 발생해서 N / 2까지만 탐색
            for (int i = 2; i <= N / 2; i++) {
                if (isPrime[i]) { // 해당 수가 소수 일 때
                    if (isPrime[N - i]) { // 그 수만큼 뺀 수가 소수라면 카운트
                        cnt++;
                    }
                }
            }

            sb.append(cnt + "\n");
        }
        System.out.println(sb);
    }
}
728x90
반응형

'Algorithm > 백준' 카테고리의 다른 글

백준 [15990] 1, 2, 3 더하기 5 (자바)  (0) 2024.05.24
백준 [1138] 한 줄로 서기 (자바)  (0) 2024.05.21
백준 [2477] 참외밭 (자바)  (0) 2024.05.19
백준 [15665] N과 M (11)  (0) 2024.05.17
백준 [15664] N과 M (10)  (0) 2024.05.17