๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

[๋ฐฑ์ค€] 1644 ์†Œ์ˆ˜์˜ ์—ฐ์†ํ•ฉ (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2022. 7. 31. 05:10

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

 

1644๋ฒˆ: ์†Œ์ˆ˜์˜ ์—ฐ์†ํ•ฉ

์ฒซ์งธ ์ค„์— ์ž์—ฐ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 4,000,000)

www.acmicpc.net


์ €๋ฒˆ์— ํ‘ผ ๋ถ€๋ถ„ํ•ฉ ๋ฌธ์ œ์˜ ์†Œ์ˆ˜ ๋ฒ„์ „.

๋น„์Šทํ•œ ๋ฌธ์ œ์—ฌ์„œ ๊ธˆ๋ฐฉ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ–ˆ๋‹ค.


์•„์ด๋””์–ด

1. ์†Œ์ˆ˜ ์ฐพ๊ธฐ

  • ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋น ๋ฅธ ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด ๋ฐฉ๋ฒ•์œผ๋กœ ์†Œ์ˆ˜๋ฅผ ์ฐพ์•˜๋‹ค.

2. ์†Œ์ˆ˜์˜ ์—ฐ์†ํ•ฉ

  • ๋ถ€๋ถ„ํ•ฉ ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ์•˜๋‹ค.

 


์ „์ฒด ์ฝ”๋“œ

import math
n = int(input())

if n == 1:
    print(0)
    exit(0)

arr = [True] * (n + 1)
arr[0] = False
arr[1] = False

for i in range(2, int(math.sqrt(n)+1)):
    if arr[i] == True:
        j = 2

        while (i * j) <= n:
            arr[i*j] = False
            j += 1

prime_list = []
for i in range(2, n + 1):
    if arr[i] == True:
        prime_list.append(i)

left = 0
right = 0
temp_prime_sum = prime_list[0]
count = 0

while left <= right:

    if temp_prime_sum > n:
        temp_prime_sum -= prime_list[left]
        left += 1
    else:
        if temp_prime_sum == n:
            count += 1
        right += 1
        if right == len(prime_list):
            break
        temp_prime_sum += prime_list[right]

print(count)

์ฝ”๋“œ ์„ค๋ช…

import math
n = int(input())

if n == 1:
    print(0)
    exit(0)

arr = [True] * (n + 1)
arr[0] = False
arr[1] = False

for i in range(2, int(math.sqrt(n)+1)):
    if arr[i] == True:
        j = 2

        while (i * j) <= n:
            arr[i*j] = False
            j += 1

prime_list = []
for i in range(2, n + 1):
    if arr[i] == True:
        prime_list.append(i)

๋จผ์ € ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด ๋ฐฉ๋ฒ•์œผ๋กœ N๊นŒ์ง€ ์†Œ์ˆ˜๋ฅผ ์ฐพ์•„์ค€๋‹ค.

์ดํ›„ ์†Œ์ˆ˜๋“ค์„ prime_list์— ๋„ฃ์–ด์ค€๋‹ค.

 

์—ฌ๊ธฐ์„œ N์ด 1์ธ ๊ฒฝ์šฐ ์•„๋ž˜์˜ ์ฝ”๋“œ์—์„œ index์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฏ€๋กœ

N์ด 1์ผ ๋•Œ๋Š” 0์„ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ์‹œ์ผœ์ค€๋‹ค.

 

left = 0
right = 0
temp_prime_sum = prime_list[0]
count = 0

while left <= right:

    if temp_prime_sum > n:
        temp_prime_sum -= prime_list[left]
        left += 1
    else:
        if temp_prime_sum == n:
            count += 1
        right += 1
        if right == len(prime_list):
            break
        temp_prime_sum += prime_list[right]

print(count)

temp_prime_sum์ด๋ผ๋Š” ์†Œ์ˆ˜์˜ ํ•ฉ์„ ์ €์žฅํ•ด ์ค„ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.

์ด ๊ฐ’์ด ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•˜๋Š” n๋ณด๋‹ค ํฌ๋ฉด

left๋ฅผ ํ•œ ์นธ ์˜ฎ๊ฒจ์„œ temp_prime_sum๊ฐ’์— ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ์†Œ์ˆ˜(prime_list[left])๋ฅผ ๋นผ์ค€๋‹ค.

n๋ณด๋‹ค ์ž‘์œผ๋ฉด right๋ฅผ ํ•œ์นธ ์˜ฎ๊ฒจ์„œ prime_list[left]๋ฅผ ๋”ํ•ด์ค€๋‹ค.

n๊ณผ ๊ฐ™์œผ๋ฉด count์— 1 ๋” ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.