μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€ 풀이

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문이 κ°€λŠ₯ν•˜λ‹€.

λ°˜μ‘ν˜•