Coding Test/BaekJoon_Python

백준 1644 <소수의 연속합> Python

JunOnJuly 2023. 11. 10. 21:10
728x90

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

 

1644번: 소수의 연속합

첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000)

www.acmicpc.net


소수 / 누적합 / 투포인터를 결합한 문제입니다. 소수 리스트를 만들 때 최적의 수로 만들지 않으면 시간이 부족했습니다.


def solution(N):
    # 소수 리스트 만들기
    # 0 은 누적합 만들기 쉽게 하려고 붙임
    prime_list = [0] + find_prime(N)
    # 소수 리스트 누적합 리스트 만들기
    subsum_prime = make_subsum(prime_list)
    # 투포인터
    start = 0
    end = 1
    # 경우의 수
    cnt = 0
    while True:
        # end 가 인덱스를 넘어가면 끝
        if end >= len(subsum_prime):
            return cnt
        # 포인터 값
        start_value = subsum_prime[start]
        end_value = subsum_prime[end]
        # 구간 합
        subsum = end_value - start_value
        # 구간 합이 목표치보다 작으면 end + 1
        if subsum < N:
            end += 1
            continue
        # 구간 합이 목표치보다 크면 start + 1
        elif subsum > N:
            start += 1
            continue
        # 같으면 경우의 수 + 1, end + 1
        else:
            cnt += 1
            end += 1
            continue


# 소수 리스트를 만드는 함수
def find_prime(N):
    # 소수 리스트
    prime_list = [2]
    # 3 부터 2 씩 증가하면서 순회
    for num in range(3, N+1, 2):
        # 소수로 나누어떨어지면 소수가 아님
        for prime in prime_list:
            # 나누어 떨어지면 다음 수            
            if not num%prime:
                break
            # 목적수의 제곱근보다 크면 종료
            if prime > num**(1/2):
                prime_list.append(num)
                break
    return prime_list


# 누적합 리스트를 만드는 함수
def make_subsum(prime_list):
    # 순회
    for idx in range(1, len(prime_list)):
        prime_list[idx] += prime_list[idx-1]
    return prime_list


N = int(input())
print(solution(N))

 

728x90

'Coding Test > BaekJoon_Python' 카테고리의 다른 글

백준 1991 <트리 순회> Python  (0) 2023.11.13
백준 2003 <수들의 합 2> Python  (0) 2023.11.10
백준 2668 <숫자고르기> Python  (0) 2023.11.09
백준 2230 <수 고르기> Python  (0) 2023.11.09
백준 2217 <로프> Python  (0) 2023.11.08