๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐Ÿ’ป๐Ÿ’ญ๐ŸŽง๐ŸŒ

BOJ 17103: ๊ณจ๋“œ๋ฐ”ํ ํŒŒํ‹ฐ์…˜ (Python) ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€ ํ’€์ด

BOJ 17103: ๊ณจ๋“œ๋ฐ”ํ ํŒŒํ‹ฐ์…˜ (Python)

adorableco 2023. 9. 4. 22:14
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

 

17103๋ฒˆ: ๊ณจ๋“œ๋ฐ”ํ ํŒŒํ‹ฐ์…˜

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T (1 โ‰ค T โ‰ค 100)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ•œ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์ •์ˆ˜ N์€ ์ง์ˆ˜์ด๊ณ , 2 < N โ‰ค 1,000,000์„ ๋งŒ์กฑํ•œ๋‹ค.

www.acmicpc.net

 

 

์ฝ”๋“œ

#์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด
array = list[1000000]
a = [False, False] + [True]*(999999)

for i in range(2,1000000):
    if a[i]:
        for j in range(2*i, 1000000, i):
            a[j] = False

t = int(input())
for i in range(t):
    
    n = int(input())
    sum = 0
    
    x = n//2
    y = n//2
    
    if x%2==0:
        if a[x] and a[y]:
            if x+y == n:
                sum+=1
        x-=1
        y+=1
    while(x>1):
        if a[x] and a[y]:
            sum+=1
        x-=2
        y+=2
    print(sum)

 

 

ํ’€์ด

์ด ๋ฌธ์ œ๋Š” ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์ˆ˜ ํŒ์ •์„ ํ•ด์•ผ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค.

 

์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด

โžก๏ธ ๋ง ๊ทธ๋Œ€๋กœ ์ฒด์ฒ˜๋Ÿผ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜๋“ค์„ ๊ฑฐ๋ฅด๋Š” ๊ฒƒ์ด๋‹ค.

  1. ๋ฐฐ์—ด์— ์›ํ•˜๋Š” ์ˆซ์ž๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ์ˆซ์ž๋ฅผ ๋‹ด๋Š”๋‹ค. ex) 100๊นŒ์ง€์˜ ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฐฐ์—ด์— 0,1,2,3,4,...,100์„ ๋‹ด๋Š”๋‹ค.
  2. for๋ฌธ์œผ๋กœ 0๋ถ€ํ„ฐ 100๊นŒ์ง€ ๋Œ๋ฉด์„œ ํ•ด๋‹น ์ˆซ์ž๊ฐ€ ์†Œ์ˆ˜์ผ ๊ฒฝ์šฐ ์ด ์ˆซ์ž์˜ ๋ฐฐ์ˆ˜๋“ค์€ ๋ชจ๋‘ ์—†์• ๋ฉด ๋œ๋‹ค. 
  3. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” 0,1์€ False๋กœ, ๋‚˜๋จธ์ง€ ์ˆ˜๋“ค์€ True๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ๋‹ค.
  4. 0,1์€ ์ฒ˜์Œ๋ถ€ํ„ฐ False ์ด๋ฏ€๋กœ for๋ฌธ ํŒจ์Šค
  5. 2๋ถ€ํ„ฐ True ์ด๋ฏ€๋กœ 2์˜ ๋ฐฐ์ˆ˜๋“ค์„ ๋ชจ๋‘ ์—†์•ค๋‹ค. (False๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.)
  6. ๋‚จ๋Š” ๊ฒƒ์€ ์†Œ์ˆ˜ ๋ฟ์ด๋‹ค. 

 

๊ณจ๋“œ๋ฐ”ํ ํŒŒํ‹ฐ์…˜ ๊ตฌํ•˜๋Š” ๋ฒ•

N ์ด 20์ด๋ผ๊ณ  ๊ฐ€์ •ํ•  ๋•Œ N์„ 2๋กœ ๋‚˜๋ˆˆ 10์„ ๊ธฐ์ค€์œผ๋กœ 2์”ฉ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ์ˆœ์—ด์„ ๋งŒ๋“ ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํŒŒ๋ž€ ์„ ์œผ๋กœ ์ด์€ ๊ฒƒ๊ณผ ๊ฐ™์ด ํ•ฉ์ด N์ธ ์Œ์ด ๊ตฌ์„ฑ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚˜๋Š” x๋ฅผ ์ค‘๊ฐ„๊ฐ’์˜ ์™ผํŽธ์ธ 3,5,7,9๋กœ, y๋ฅผ ์ค‘๊ฐ„๊ฐ’์˜ ์˜ค๋ฅธํŽธ์ธ 11,13,15,17 ๋กœ ๋‘์—ˆ๋‹ค.

 

N/2 ๊ฐ€ ์ง์ˆ˜์ด๋ฉด x๋Š” N/2-1 ๋กœ, y๋Š” N/2+1 ๋กœ ๋‘๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.

 

Why?

์ง์ˆ˜์ธ N/2 ์—์„œ๋ถ€ํ„ฐ 2์”ฉ ์ฐจ์ด๊ฐ€ ๋‚˜๋„๋ก ์ˆซ์ž๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ๋ชจ๋“  ์ˆซ์ž๊ฐ€ ์ง์ˆ˜๊ฐ€ ๋˜๋Š”๋ฐ ์ง์ˆ˜๋Š” 2๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ  ๊ณจ๋“œ๋ฐ”ํ ํŒŒํ‹ฐ์…˜์˜ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โš ๏ธ ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด N=4 ์ผ ๋•Œ x=2, y=2 ์ฒ˜๋Ÿผ ์Œ์˜ ๋ชจ๋“  ์ˆ˜๊ฐ€ ์ง์ˆ˜์ด์ง€๋งŒ ๋ชจ๋‘ ์†Œ์ˆ˜๋ผ์„œ ๊ณจ๋“œ๋ฐ”ํ ํŒŒํ‹ฐ์…˜ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜์—ฌ๋„ ๋ฌด์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋”ฐ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค. 

    if x%2==0:
        if a[x] and a[y]: # N=4 ์ผ ๋•Œ (2,2) ๋Š” ๊ณจ๋“œ๋ฐ”ํ ํŒŒํ‹ฐ์…˜์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.
            if x+y == n:
                sum+=1
        x-=1
        y+=1

 

๊ทธ๋ฆฌ๊ณ  x๊ฐ€ 1๋ณด๋‹ค ์ž‘์•„์ง€๊ธฐ ์ „๊นŒ์ง€ x๋Š” 2์”ฉ ์ค„์ด๊ณ , y๋Š” 2์”ฉ ๋Š˜๋ฆฌ๋ฉด์„œ x,y ๊ฐ€ ๋ชจ๋‘ ์†Œ์ˆ˜์ผ ๋•Œ sum+=1 ์„ ํ•˜์—ฌ ๊ณจ๋“œ๋ฐ”ํ ํŒŒํ‹ฐ์…˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

 

while(x>1):
        if a[x] and a[y]:
            sum+=1
        x-=2
        y+=2
    print(sum)

 

โœ…์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋กœ a๋ผ๋Š” ๋ฐฐ์—ด์— ์†Œ์ˆ˜๋งŒ์„ True๋กœ ๋‚จ๊ฒจ๋‘์—ˆ์œผ๋ฏ€๋กœ ์œ„์™€ ๊ฐ™์€ if๋ฌธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฐ˜์‘ํ˜•