[백준] 소수의 연속합 (1644)

크타·2022년 11월 22일
0

백준

목록 보기
5/11

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

먼저 n이하의 소수를 구한 뒤, 그 다음 연속합을 구하는 문제이다.
메모리 조건이 빡빡할 것 같아 에라스토네세의 체를 이용하기로 했다.
또한 연속합이니 투 포인터로 구현하면 될 것 같았다.

글을 쓰다 보니 solve 함수를 왜 구현했지? 라는 생각이 든다.
while 조건문에서 바로바로 숫자를 빼줬으면 됐을텐데
만약 시간 초과가 났다면 위 방식으로 했을 것이다.

import sys

n = int(input())
if n == 1: # n은 1일땐 arsto()가 안돌아가서 공백이기에 그냥 바로 0 출력하고 종료
    print(0)
    sys.exit(0)
visited = [False, False] + [True] * (n - 1) # 0, 1은 False로 선언
left = right = cnt = 0
primes = []


def arsto(): # start부터 end사이의 합 구하기
    for i in range(2, n + 1):
        if visited[i]:
            primes.append(i)
            for j in range(2 * i, n + 1, i):
                visited[j] = False


def solve(start, end):
    temp = 0
    for i in range(start, end + 1):
        temp += primes[i]
    return temp


arsto()
while 1:
    temp = solve(left, right)
    if temp < n:
        right += 1
    elif temp == n:
        cnt += 1
        right += 1
    else:
        left += 1
    if right == len(primes) and left == len(primes) - 1:
        break

print(cnt)

0개의 댓글