본문 바로가기
코딩테스트 파이썬/백준

소수의 연속합 ( 1644 번 )

by 세용용용용 2025. 6. 29.

1644번: 소수의 연속합

 

🧠 알고리즘

_mk() : 에라토스테네스 체를 이용해 2부터 n까지 소수 구함
_main() : 투 포인터 방식으로 소수 리스트 내 연속된 소수 합이 n이 되는 경우 확인

 

🧾 코드

import sys

def _mk(num): # 에토체 (0: 소수 아님, 1: 소수)
    answer = [1] * (num + 1)
    answer[0], answer[1] = 0, 0
    for i in range(2, int(num ** (1/2)) + 1):
        if answer[i]:
            for j in range(i * i, num + 1, i):
                answer[j] = 0

    return [i for i in range(len(answer)) if answer[i]]


def _main(num, sosu_list): # 투 포인터
    answer = 0
    now_sum, max_len = 0, len(sosu_list)
    l, r = 0, -1

    while True:
        if now_sum <= num:
            if now_sum == num:
                answer += 1
            r += 1

            if r == max_len:
                break
            now_sum += sosu_list[r]

        elif now_sum > num:
            now_sum -= sosu_list[l]
            l += 1

    return answer
    

n = int(sys.stdin.readline().rstrip())
sosu_list = _mk(n)
print(_main(n, sosu_list))

 

⏱️ 시간 복잡도

_mk(num) : 에스테라토스 ( 선형 로그 시간 복잡도 )
_main(num, sosu_list) : 투 포인터 ( 선형 시간 복잡도 )

해당 알고리즘 시간 복잡도 : 선형 로그 시간 복잡도 ( O(n log n) )

'코딩테스트 파이썬 > 백준' 카테고리의 다른 글

텀 프로젝트 ( 9466 번 )  (3) 2025.07.05
두 배열의 합 ( 2143 번 )  (0) 2025.06.29
수 나누기 게임 ( 27172 번 )  (0) 2025.06.29
사이클 게임 ( 20040 번 )  (0) 2025.06.29
ACM Craft ( 1005번 )  (0) 2025.06.19