백준

백준[17103]번 : 골드바흐 파티션 ( JAVA )

하루우울루 2023. 3. 17. 11:21

https://www.acmicpc.net/problem/17103

 

17103번: 골드바흐 파티션

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

www.acmicpc.net


개발환경은 eclipse를 사용했습니다.

 

Code

import java.util.*;

public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		int t = sc.nextInt(); // 테스트 케이스 입력받음

		boolean[] arr = new boolean[1000002]; // 논리형 배열 선언

		arr[0] = false;
		arr[1] = false; // 1은 소수로 생각하지 않음

		for (int i = 2; i < arr.length; i++) { // 2부터 배열크기만큼 소수라고 저장
			arr[i] = true;
		}

		for (int i = 2; i < arr.length; i++) {
			if (arr[i] == true) { // 소수일 경우 
				for (int j = i + i; j < arr.length; j += i) { // 배수들을 false로 저장
					arr[j] = false;
				}
			}
		}

		while (t-- > 0) { // 테스트 케이스 실행
			int n = sc.nextInt();
			int ans = 0;

			for (int i = 2; i < n; i++) { //2 부터 입력값까지 판별
				boolean q = arr[i];
				boolean p = arr[n-i];
				
				if (q && p && i <= n-i) { // i와 n-i를 더하면 n이므로 둘 다 소수일 경우와 중복을 방지하기 위한 조건
					ans++; // 출력 값 증가
				}
			}

			System.out.println(ans); // 출력
		}

		sc.close();

	}

}

처음에는 리스트를 이용해서 소수들을 찾아 contains를 사용해 풀었다

제출했더니 시간초과가 나서 방법을 알아보니 에라토스테네스의 체를 사용해서 푸는 문제였다.

 

코드에 주석을 보면 코드를 이해할 수 있을 것이다.

 

ans 값을 증가시킬 때 조건문에 중복을 방지하기 위해 i <= n - i를 사용한 점을 참고하면 좋겠다.