728x90
알고리즘 설명
문제 설명
자연수 n 이 주어질 때, n을 하나 이상의 연속된 소수의 합으로 나타낼 수 있는 경우의 수를 구하는 문제
코드 설명
- n이하의 모든 소수를 찾는다. (에라토스테네스의 체를 이용)
- 찾은 소수들을 투 포인터를 이용하여 연속된 소수의 합으로 n을 나타낼 수 있는 경우를 찾는다.
import math
n = int(input())
# n이 1인 경우 소수의 합으로 나타낼 수 없으므로 0 출력 후 종료
if n == 1:
print(0)
exit(0)
# 에라토스테네스의 체 초기화
arr = [1] * (n + 1)
arr[0] = arr[1] = 0 # 0과 1은 소수가 아니므로 0으로 설정
# 에라토스테네스의 체를 사용하여 소수 판별
for i in range(2, int(n**0.5) + 1):
if arr[i] == 1:
for j in range(i * i, n + 1, i):
arr[j] = 0
# 소수 리스트 생성
prime_list = [i for i in range(2, n + 1) if arr[i] == 1]
# 투 포인터를 사용하여 연속된 소수의 합으로 n을 나타낼 수 있는 경우의 수를 찾기
s = 0
e = 0
res = 0
tmp = prime_list[0]
while s <= e:
if tmp < n:
e += 1
if e == len(prime_list):
break
tmp += prime_list[e]
elif tmp > n:
tmp -= prime_list[s]
s += 1
else:
res += 1
e += 1
if e == len(prime_list):
break
tmp += prime_list[e]
print(res)
반응형
'백준 문제풀이 코드저장소 > Gold' 카테고리의 다른 글
Baekjoon 1069. 집으로 / Pyhton (0) | 2024.07.04 |
---|---|
Baekjoon 2252. 줄 세우기 / Python (0) | 2024.07.03 |
Baekjoon 17386. 선분 교차 1 / Python (0) | 2024.07.03 |
Baekjoon 7579. 앱 / Python (0) | 2024.07.02 |