Problem Solving/BOJ & Programmers

[BOJ] 2960번: RESETO

geum 2024. 1. 18. 16:38

문제

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λŠ” N보닀 μž‘κ±°λ‚˜ 같은 λͺ¨λ“  μ†Œμˆ˜λ₯Ό μ°ΎλŠ” 유λͺ…ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

이 μ•Œκ³ λ¦¬μ¦˜μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  1. 2λΆ€ν„° NκΉŒμ§€ λͺ¨λ“  μ •μˆ˜λ₯Ό μ λŠ”λ‹€.
  2. 아직 μ§€μš°μ§€ μ•Šμ€ 수 쀑 κ°€μž₯ μž‘μ€ 수λ₯Ό μ°ΎλŠ”λ‹€. 이것을 P라고 ν•˜κ³ , 이 μˆ˜λŠ” μ†Œμˆ˜μ΄λ‹€.
  3. Pλ₯Ό μ§€μš°κ³ , 아직 μ§€μš°μ§€ μ•Šμ€ P의 배수λ₯Ό 크기 μˆœμ„œλŒ€λ‘œ μ§€μš΄λ‹€.
  4. 아직 λͺ¨λ“  수λ₯Ό μ§€μš°μ§€ μ•Šμ•˜λ‹€λ©΄, λ‹€μ‹œ 2번 λ‹¨κ³„λ‘œ κ°„λ‹€.

N, Kκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, K번째 μ§€μš°λŠ” 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…μΆœλ ₯ μ˜ˆμ‹œ

 

풀이

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λŠ” ꡉμž₯히 유λͺ…ν•œ μœ ν˜•μž„μ—λ„ λΆˆκ΅¬ν•˜κ³  λ³Ό λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ λŠλ‚Œμ΄λ‹€. 풀이λ₯Ό μ™„μ „νžˆ μ™Έμ›Œλ‘λ˜κ°€ ν•΄μ•Όκ² λ‹€.

 

μ•„λž˜λŠ” 문제λ₯Ό 보고 λ‚΄ 머릿속에 λ– μ˜¬λžλ˜ 생각듀이닀.

 

β—Ύ μ§€μ›Œμ§„ μˆ«μžκ°€ λͺ‡ λ²ˆμ§ΈμΈμ§€ μ„ΈκΈ° μœ„ν•œ λ³€μˆ˜κ°€ ν•„μš”ν•¨ → cnt λ³€μˆ˜ μ •μ˜

β—Ύ cntλ₯Ό μ •μ˜ν–ˆλ‹€λ©΄, λ³€μˆ˜λ₯Ό κ°±μ‹ ν•˜λŠ” μ‹œμ μ„ μ„€μ •ν•΄μ•Ό 함

 

λ³€μˆ˜ κ°±μ‹  μ‹œμ μ€ 6, 12처럼 μ—¬λŸ¬ 수의 곡배수λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•˜λ‹€. N=7이라면 [2, 3, 4, 5, 6, 7]κ³Ό 같은 μ •μˆ˜ λ¦¬μŠ€νŠΈκ°€ λ§Œλ“€μ–΄μ§ˆ 것이고, μ§€μ›Œμ§€λŠ” 숫자의 μˆœμ„œλŠ” 2 → 4 → 6 → 3 →  5 →  7이 λœλ‹€. 이 λ•Œ νŠΉμ • 쑰건 없이 cnt에 계속 +1을 ν•˜λ‹€ 보면 6은 이미 μ§€μ›Œμ‘ŒλŠ”λ°λ„ 3의 λ°°μˆ˜μ—μ„œ 걸리기 λ•Œλ¬Έμ— cnt 값이 μ΄μƒν•˜κ²Œ μ €μž₯λ˜μ–΄ 버린닀.

 

이런 경우λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ remove_checkλΌλŠ” 리슀트λ₯Ό μ‚¬μš©ν–ˆλ‹€.

 

remove_check 리슀트의 역할은 이미 μ§€μ›Œμ§„ 숫자라면 ν•΄λ‹Ή 인덱슀 값을 1둜 λ°”κΎΈλŠ” κ²ƒμœΌλ‘œ, remove_check 값이 1이 아닐 λ•Œλ§Œ(=아직 μ•ˆ μ§€μ›Œμ‘Œλ‹€λŠ” 뜻) cnt 값을 1μ”© μ¦κ°€μ‹œν‚¨λ‹€.

 

 cnt 값이 Kλž‘ κ°™μ•„μ§€λŠ” μ‹œμ μ΄ 였면 ν•΄λ‹Ή 값을 λ°”λ‘œ 좜λ ₯ν•œ ν›„ λͺ¨λ“  for문을 νƒˆμΆœν•˜λ©΄ ν•΄κ²°!

 

..이긴 ν•œλ° λ­”κ°€ λ‚΄μš©μ΄ κΉ”λ”ν•˜κ²Œ μ •λ¦¬λ˜μ§€ μ•Šμ€ λ“―ν•œ 이 λŠλ‚Œ 😢

 

# Silver 4

import sys

N, K = map(int, sys.stdin.readline().split())

integer_list = [num for num in range(2, N+1)]

remove_check = [0]*(N+1)

remove_check[0] = remove_check[1] = 1

cnt = 0

for i in range(2, N+1):
    for j in range(i, N+1, i):
        if remove_check[j] != 1:
            remove_check[j] = 1
            cnt += 1

        if cnt == K and remove_check[j] == 1:
            print(j)
            exit()

 

 

값을 좜λ ₯ν•˜κΈ° 전에 remove_check[j] 값이 1인지 ν™•μΈν•˜λŠ” 쑰건문을 μ§€μš°λ‹ˆκΉŒ μ‹œκ°„μ΄ μ’€ 더 κ±Έλ ΈλŠ”λ° 아직 μ΄μœ λŠ” νŒŒμ•…ν•˜μ§€ λͺ»ν–ˆμŒ

'Problem Solving > BOJ & Programmers' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] 2217번: λ‘œν”„  (1) 2024.02.25
[BOJ] 14501번: 퇴사  (1) 2024.02.05
[BOJ] 15686번: μΉ˜ν‚¨ 배달  (0) 2024.01.16
[BOJ] 1789번: μˆ˜λ“€μ˜ ν•©  (1) 2024.01.02
[BOJ] 1475번: λ°© 번호  (1) 2023.12.03