백준

[백준] 1644 소수의 연속합 [Python, 파이썬]

YoonJuHan 2023. 11. 9. 13:58
  • 문제 : https://www.acmicpc.net/problem/1644
  • 🔑 에라토스테네스의 체를 사용해 소수 찾기
    • 먼저 시간초과가 나지 않으려면 소수를 찾을 때 에라토스테네스의 체를 사용해야 한다.
    • n까지의 소수를 미리 구해놓는다.
    • start, end 두 개의 포인터를 사용 (0, 0)
    • 첫 번째 소수부터 시작해서 소수의 합이 n보다 작으면 end 포인터를 한 칸씩 오른쪽으로 옮긴다.
    • 합이 n이 되면 정답을 올린다.
    • 합이 n보다 커지커나 같아지면 start 포인터를 한 칸씩 오른쪽으로 옮긴다.
    • 위 방법 반복
    • 끝 ✨

 

n = int(input())

prime_check = [True] * (n+1)    # 소수의 배수들을 체크

for i in range(2, int(n ** 0.5) + 1):
    if prime_check[i]:
        for j in range(i*2, n + 1, i):  # 소수 자신을 제외한 배수에 체크
            prime_check[j] = False

prime_number = [i for i in range(2, n+1) if prime_check[i]] # 소수 리스트

answer = 0
sum = 0
start, end = 0, 0

while start < len(prime_number):
    if sum < n:
        sum += prime_number[end]
        if end != len(prime_number) - 1:    # end 포인터가 끝을 벗어나지 않게
            end += 1
    elif sum >= n:
        sum -= prime_number[start]
        start += 1
    if sum == n:
        answer += 1

print(answer)