🧩 Algorithm/[BOJ] Silver

BOJ 2960번 : μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 (Python/Silver 4)

devCloud 2023. 9. 23. 19:35
728x90
 

2960번: μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

2, 4, 6, 8, 10, 3, 9, 5, 7 μˆœμ„œλŒ€λ‘œ μ§€μ›Œμ§„λ‹€. 7번째 μ§€μ›Œμ§„ μˆ˜λŠ” 9이닀.

www.acmicpc.net


μ„€λͺ…

λ‹¨μˆœνžˆ μ†Œμˆ˜λ₯Ό κ΅¬ν•˜λŠ” 것이 μ•„λ‹ˆλ‹€. μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체의 원리λ₯Ό λ°˜μ˜ν•˜λ©΄μ„œ 문제λ₯Ό ν’€μ–΄μ€˜μ•Ό ν•œλ‹€. λ‹€μ‹œ 말해 2λΆ€ν„° NκΉŒμ§€μ˜ λͺ¨λ“  μ •μˆ˜ 쀑 제일 μž‘μ€ μˆ˜λΆ€ν„° μ‹œμž‘ν•˜μ—¬ κ·Έ μ†Œμˆ˜μ˜ λ°°μˆ˜λ“€μ„ λͺ¨λ‘ μ§€μ›Œλ‚˜κ°„λ‹€. μ§€μ›Œλ‚˜κ°”μœΌλ©΄, μ•ˆ μ§€μ›Œμ§„ κ°€μž₯ μž‘μ€ μˆ˜λΆ€ν„° λ˜λ‹€μ‹œ λ°˜λ³΅ν•œλ‹€. μ—¬κΈ°κΉŒμ§€κ°€ μ—λΌν† μŠ€ν…Œλ„€μŠ€ 체의 원리이닀.

이 λ¬Έμ œμ—μ„œλŠ” μ†Œμˆ˜λ„ μ§€μ›Œμ•Ό ν•˜κ³  λ°°μˆ˜λ„ μ§€μ›Œμ•Ό ν•˜λŠ”λ° κ·Έ κ³Όμ •μ—μ„œ K번째둜 μ§€μ›Œμ§€λŠ” 수λ₯Ό μ°ΎλŠ” 것이닀. 

 

풀이

βžͺ μ—λΌν† μŠ€ν…Œλ„€μ˜ 체 μ•Œκ³ λ¦¬μ¦˜μ΄ κΆκΈˆν•˜λ‹€λ©΄?

 

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λž€? μ†Œμˆ˜λ₯Ό μ°ΎλŠ” λ°©λ²•μœΌλ‘œ, κ³ λŒ€ 그리슀 μˆ˜ν•™μž μ—λΌν† μŠ€ν…Œλ„€μŠ€κ°€ λ°œκ²¬ν–ˆλ‹€. 이 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ‹¨μˆœνžˆ μ†Œμˆ˜λ₯Ό κ΅¬ν•˜λ €κ³  ν•  λ•Œ μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λ―€λ‘œ μ†Œμˆ˜λ₯Ό ꡬ

dev-cloud.tistory.com

 

Solution

#18:31 - 19:19
#문제 μ„€λͺ… : 2λΆ€ν„° NκΉŒμ§€μ˜ λͺ¨λ“  μ •μˆ˜ 쀑 μ†Œμˆ˜λ₯Ό νŒλ³„ν•΄ κ°€λ©΄μ„œ K번째둜 μ§€μš°λŠ” 수λ₯Ό κ΅¬ν•œλ‹€.(μ†Œμˆ˜λ„ 지움)
import sys
input = sys.stdin.readline

N, K = map(int, input().split())
m = int(N**0.5) #제곱근
a = [True]*(N+1) #μ†Œμˆ˜ νŒμ •ν•˜κΈ° μœ„ν•¨

cnt = 0
for i in range(2, N+1): #제곱근으둜 ν•˜λ‹ˆκΉ μ•ˆ 됨 μ΄μœ λŠ”? μ†Œμˆ˜λ₯Ό μ°ΎλŠ” 것이 μ•„λ‹ˆλΌ μ§€μ›Œμ§€λŠ” 숫자λ₯Ό μ°Ύμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έ.
    if a[i] == True: #μ†Œμˆ˜μ΄λ©΄
        #a[i] = False #μ†Œμˆ˜λ„ μ§€μš°κ³  #이건 없어도 됨
        cnt += 1
        if cnt == K:
            print(i)
        for j in range(i + i, N + 1, i): #λ°°μˆ˜λ„ μ§€μš°κΈ°
            if a[j] == True: #μ§€μ›Œμ§€μ§€ μ•Šμ€ κ²ƒλ§Œ 
                a[j] = False
                cnt += 1
                if cnt == K:
                    print(j)

κ°„λ‹¨ν•œ 풀이

N, K = map(int, input().split())
cnt = 0
nums = [True] * (N + 1)
for i in range(2, len(nums) + 1):
    for j in range(i, N+1, i):
        if nums[j] == True:
            nums[j] = False
            cnt += 1
            if cnt == K:
                print(j)
                break
728x90