Updated:

이전에 ν’€μ—ˆλ˜ 문제인데 λͺ» ν’€μ—ˆλ‹€.
기둝을 λ³΄λ‹ˆ 이전에도 λͺ» ν’€μ–΄μ„œ κ²°κ΅­ κ΅¬κΈ€λ§μœΌλ‘œ ν•΄κ²°ν–ˆλ˜ λ¬Έμ œμ˜€λ‹€.
μ—­μ‹œλ‚˜ 머리에 아무것도 μ•ˆ λ‚¨μ•˜λ˜ κ±°λ‹€ .. !

βœοΈπŸ‘€

μ²˜μŒμ— μž¬κ·€λ‘œ ν’€λ €λ‹€κ°€ μ‹œκ°„μ΄ˆκ³Όκ°€ 계속 λ–΄λ‹€. DP둜 ν•΄κ²°ν•΄μ•Ό ν•˜λŠ” 문제라고 ν•œλ‹€.

Dynamic Programming

λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ€ λ‹€μŒμ˜ 쑰건을 λ§Œμ‘±ν•  λ•Œ μ‚¬μš©ν•  수 μžˆλ‹€.

  1. 큰 문제λ₯Ό μž‘μ€ 문제둜 λ‚˜λˆŒ 수 μžˆλ‹€.
  2. μž‘μ€ λ¬Έμ œμ—μ„œ κ΅¬ν•œ 정닡은 그것을 ν¬ν•¨ν•˜λŠ” 큰 λ¬Έμ œμ—μ„œλ„ λ™μΌν•˜λ‹€.

Memoization λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬ν˜„ν•˜λŠ” 방법 쀑 ν•˜λ‚˜λ‘œ, ν•œ 번 κ΅¬ν•œ κ²°κ³Όλ₯Ό λ©”λͺ¨λ¦¬ 곡간에 λ©”λͺ¨ν•΄λ‘κ³  같은 식을 λ‹€μ‹œ ν˜ΈμΆœν•˜λ©΄ λ©”λͺ¨ν•œ κ²°κ³Όλ₯Ό κ·ΈλŒ€λ‘œ κ°€μ Έμ˜€λŠ” 기법을 μ˜λ―Έν•œλ‹€. β€˜μΊμ‹±β€™ 이라고도 ν•œλ‹€.

리슀트둜 κ΅¬ν˜„ν•œλ‹€.
λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ μž¬κ·€μ μœΌλ‘œ μˆ˜ν–‰ν•˜λ‹€κ°€ 같은 정보가 ν•„μš”ν•  λ•Œμ— λ¦¬μŠ€νŠΈμ—μ„œ 값을 κ·ΈλŒ€λ‘œ κ°€μ Έμ˜¨λ‹€.

πŸ’» code

import sys
sys.setrecursionlimit(10**7)
input = sys.stdin.readline

X = int(input())
dp = [0] * (X + 1)

for i in range(2, X+1):

    # μš°μ„  -1 연산을 ν•˜λŠ” 경우λ₯Ό λ„£μ–΄λ‘”λ‹€.
    dp[i] = dp[i-1] + 1

    if i % 2 == 0:
        dp[i] = min(dp[i], dp[i // 2] + 1)
    if i % 3 == 0:
        dp[i] = min(dp[i], dp[i // 3] + 1)

print(dp[-1])


크기 X+1인 dp 리슀트λ₯Ό μ€€λΉ„ν•œλ‹€.
μ΄λ•Œ dpλŠ” 각 ν•΄λ‹Ή 인덱슀 μˆ«μžκ°€ 1이 λ˜λŠ” μ΅œμ†Œ 횟수λ₯Ό λ‹΄κ²Œ λœλ‹€.
예λ₯Ό λ“€μ–΄ dp[3]은 숫자 3이 1이 λ˜λŠ” μ΅œμ†Œ νšŸμˆ˜λ‹€.

μ •μˆ˜ Xκ°€ 10인 경우λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ 10을 1둜 λ§Œλ“œλŠ” μ΅œμ†Œ νšŸμˆ˜λŠ”

1. 9(= 10 - 1)κ°€ 1이 λ˜λŠ” μ΅œμ†Œ 횟수 + 1 (10 - 1 μ—°μ‚°)
λ˜λŠ”
2. 5( = 10 // 2)κ°€ 1이 λ˜λŠ” μ΅œμ†Œ 횟수 + 1 (10 // 2 μ—°μ‚°)

1, 2 κ°’ 쀑 더 μž‘μ€ 값이 λœλ‹€.

μ˜ˆμ‹œλ‘œ λ“  10은 3으둜 λ‚˜λˆ„μ–΄μ§€μ§€ μ•Šμ•˜μ§€λ§Œ λ§Œμ•½ 3으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 숫자라면

3. μž…λ ₯숫자//3 이 1이 λ˜λŠ” μ΅œμ†Œ 횟수 + 1 (μž…λ ₯숫자 // 3 μ—°μ‚°)

이 μΆ”κ°€λ˜λ©° 1, 2, 3 μ€‘μ—μ„œ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λ©΄ λœλ‹€.

Reference

  • λ‚˜λ™λΉˆ, βŒœμ΄κ²ƒμ΄ 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with 파이썬⌟

Leave a comment