본문 바로가기
문제 풀이/백준(BOJ)

[C++] 백준 17103번 : 골드바흐 파티션

by 희조당 2021. 5. 24.
728x90

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

 

17103번: 골드바흐 파티션

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

www.acmicpc.net


문제 풀이

 에라토스테네스의 체를 이용해서 소수들을 정의하고 2부터 입력받은 값(N)의 반까지 경우를 모두 따진다.

느낀 점

 예전의 소수 문제들과 비슷해서 바로 풀어봤는데 그 당시에는 시간제한이 널널해서 에라토스테네스의 체를 사용하지 않았는데 이번엔 0.5초 제한으로 안 쓸 수가 없었다. 이번 기회로 알고리즘을 다시 정리한 계기가 되었다.

 에라토스테네스의 체

시간복잡도 : O(NloglogN) / 2부터 시작해서 자신을 제외한 배수는 모두 지운 나머지는 소수

코드

#include <iostream>
#include <vector>
#define MAX 1000001
using namespace std;

bool prime[MAX] = { 0, };
vector<int>v;

void set_Prime() {
	for (int i = 2;i < MAX;i++) {
		prime[i] = true;
	}
	for (int i = 2; i < MAX;i++) {
		if (!prime[i]) continue;
		for (int j = i + i;j < MAX;j += i) {
			prime[j] = false;
		}
	}
}

int partition(int n) {
	int cnt = 0, mid = n / 2, idx = 2;
	while (idx <= mid) {
		if (prime[idx] && prime[n - idx]) cnt++;
		idx++;
	}
	return cnt;
}

int main() {
	set_Prime();
	int T, n;
	cin >> T;
	for (int i = 0; i < T;i++) {
		cin >> n;
		v.push_back(partition(n));
	}

	for (int i = 0; i < T;i++) {
		cout << v[i] << "\n";
	}

}

'문제 풀이 > 백준(BOJ)' 카테고리의 다른 글

[C++] 백준 2580번 : 스도쿠  (0) 2021.05.24
[C++] 백준 9663번 : N-Queen  (0) 2021.05.24
[C++] 백준 15652번 : N과 M (4)  (0) 2021.05.24
[C++] 백준 15650번 : N과 M (3)  (0) 2021.05.23
[C++] 백준 15650번 : N과 M (2)  (0) 2021.05.23

댓글