Coding Test/백준

[백준 1644번] 소수의 연속합

Lucian_Cho 2021. 3. 22. 06:08

# 문제

 


내 풀이
# 2부터 4000000까지의 모든 수에 대하여 소수 판별 (n의 최대 입력)
limit_num = 4000000
# 처음엔 모든 수를 소수(True)인 것으로 초기화(0, 1은 제외)
array = [True for _ in range(limit_num + 1)]

# 에라토스테네스의 체 알고리즘 수행
# 2부터 limit_num의 제곱근까지의 모든 수를 확인하며
for i in range(2, int(limit_num ** 0.5) + 1):
    if array[i] == True:
        # i를 제외한 i의 모든 배수를 지우기
        j = 2
        while i * j <= limit_num:
            array[i * j] = False
            j += 1

# 판별된 소수를 새로운 리스트에 담음
prime_nums = []
for i in range(2, limit_num + 1):
    if array[i]:
        prime_nums.append(i)

# n 입력 받기
n = int(input())

p_len = len(prime_nums)  # 소수의 총 개수
result = 0  # 연속된 소수의 합이 n인 모든 경우의 수
interval_sum = 0  # 현재 부분합
end = 0

# start를 차례대로 증가시키며 반복
for start in range(p_len):
    # end를 가능한 만큼 이동시키기
    while interval_sum < n and end < p_len:
        interval_sum += prime_nums[end]
        end += 1
    # 부분합이 n일 때 카운트 증가
    if interval_sum == n:
        result += 1
    interval_sum -= prime_nums[start]

# 결과 출력
print(result)

 

접근 방법
N의 최대 입력을 고려하여, 에라토스테네스 체를 사용해 소수들만 분류한다. 그리고 투 포인터 알고리즘을 사용해, 연속된 소수의 합이 n인 경우의 수를 모두 센다.

 

생각해볼 점
시간 복잡도가 O(NloglogN)이라 결과적으론 잘 통과하지만, 연산 수가 많아 조금 느리다. Pypy에서는 1초이내로 마무리된다.

 

시간 복잡도
O(NloglogN) - 에라토스테네스의 체 알고리즘 수행이 제일 오래 걸리므로