ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

1644번: μ†Œμˆ˜μ˜ 연속합

문제 ν•˜λ‚˜ μ΄μƒμ˜ μ—°μ†λœ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” μžμ—°μˆ˜λ“€μ΄ μžˆλ‹€. λͺ‡ 가지 μžμ—°μˆ˜μ˜ 예λ₯Ό λ“€μ–΄ 보면 λ‹€μŒκ³Ό κ°™λ‹€. 3 : 3 (ν•œ 가지) 41 : 2+3+5+7+11+13 = 11+13+17 = 41 (μ„Έ 가지) 53 : 5+7+11+13+17 = 53 (두

www.acmicpc.net

 

문제 풀이

 μ΄ λ¬Έμ œλŠ” μˆ˜λ“€μ˜ ν•© 2λΆ€λΆ„ν•© λ¬Έμ œμ—μ„œ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 경우의 수λ₯Ό μ°ΎλŠ” λ¬Έμ œμ΄λ‹€. 연속합을 κ΅¬ν•˜λŠ” λ‘œμ§μ€ μ•žμ„œ 닀룬 2 λ¬Έμ œμ™€ λ™μΌν•˜λ©°, μ†Œμˆ˜λ₯Ό κ΅¬ν•˜λŠ” λΆ€λΆ„λ§Œ μΆ”κ°€ν•˜λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ΄λ‹€.

 

μ½”λ“œ

from sys import stdin


def is_prime(num):
    find = []
    check = [True] * (num + 1)
    check[1] = False

    for i in range(2, num + 1):
        if check[i]:
            find.append(i)
        for j in range(i * i, num + 1, i):
            check[j] = False

    return find

if __name__ == '__main__':
    answer = start = end = 0
    n = int(stdin.readline())
    primes = is_prime(n)

    subtotal = [0] * (n + 1)
    for i in range(1, len(primes) + 1):
        subtotal[i] = subtotal[i - 1] + primes[i - 1]

    while True:
        cur_subtotal = subtotal[end] - subtotal[start]

        if cur_subtotal == n:
            answer += 1
            start += 1
        elif cur_subtotal > n:
            start += 1
        elif end == len(primes):
            break
        else:
            end += 1

    print(answer)
728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€