알고리즘 문제 풀이/백준
[python] boj 17103 골드바흐 파티션
weekyear
2021. 4. 18. 13:23
알고리즘은 꾸준히 풀었는데 글 업로드를 안 했다...정말이다..정말 열심히 풀었다..
어쨌든 낮은 난이도에 비해 배울 점이 많은 문제라서 이렇게 기록을 남기게 되었다.
17103번: 골드바흐 파티션
첫째 줄에 테스트 케이스의 개수 T (1 ≤ T ≤ 100)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 N은 짝수이고, 2 < N ≤ 1,000,000을 만족한다.
www.acmicpc.net
기본 아이디어
- 두 소수의 합으로 짝수를 이루는 과정에서 각 수에 대해 소수이지 확인하는 절차가 필요하다.
- 입력이 첫째줄에 테스트 케이스의 수가 주어지고 그 수 만큼 테스트 케이스가 주어지는 구조이다.
- 각 수에 대해 소수인지 체크한 리스트를 한 번만 만들어놓으면 여러 테스트 케이스에서 공용으로 사용할 수 있다.
- 소수인지 확인하는 과정에서도 에라토스테네스의 체를 활용한다. 참고) wikidocs.net/21638
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
- 2보다 큰 짝수 num은 num = i + (num - i) 로 나타낼 수 있고 i랑 (num - i)가 둘 다 소수인지만 증명하면 골드바흐의 추측에 해당한다.
def get_primary_list(n):
array = [1 for _ in range(n+1)]
for i in range(2, int(n ** 0.5) + 1):
if array[i]:
j = 2
while i * j <= n:
array[i * j] = 0
j += 1
return array
T = int(input())
nums = [int(input()) for _ in range(T)]
max_num = max(nums)
primarys = get_primary_list(max_num)
for num in nums:
result = 0
for i in range(2, num // 2 + 1):
if primarys[i] and primarys[num - i]:
result += 1
print(result)
유의사항
- 여러 테스트 케이스가 주어지는 경우 공용으로 사용할만한 코드가 있다면 반복문 바깥으로 빼서 활용하면 시간을 많이 줄일 수 있다.
- 소수를 구하는 로직이 필요하다면 에라토스테네스를 활용하자.
반응형