songining
article thumbnail

 

 

μ²˜μŒμ—λŠ” κ·Έλƒ₯ 쑰건문을 λ§Œλ“€μ–΄ κ·Έλ¦¬λ””μ•Œκ³ λ¦¬μ¦˜ λ°©μ‹μœΌλ‘œ 계속 κ·Έλ•Œκ·Έλ•Œ μž‘μ€μˆ˜λ₯Ό λ§Œλ“€λ©΄μ„œ 짜면 될 쀄 μ•Œμ•˜λ‹€. 

ν•˜μ§€λ§Œ 10을 μž…λ ₯으둜 λ„£μ—ˆμ„ λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ˜€κ³  μš°μ„ μˆœμœ„λ₯Ό 정해놓고 μ§œλŠ” λ°©μ‹μœΌλ‘œλŠ” ν•˜λ©΄ μ•ˆλ˜κ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€. 

μœ„μ˜ λ¬Έμ œμ—μ„œ μ˜λ„ν•œ 풀이법은 DP μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ 점화식을 μ΄μš©ν•˜λŠ” 것이 κ°€μž₯ μ’‹λ‹€. 

DP(λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°)λž€ 큰 문제λ₯Ό μž‘μ€ 문제둜 λ‚˜λˆ„μ–΄ ν‘ΈλŠ” 방법이닀. 이 μž‘μ€ λ¬Έμ œλ“€μ€ μ–΄λ”˜κ°€μ— μ €μž₯ν•΄λ†“λŠ”λ‹€. 그리고 이 μž‘μ€ λ¬Έμ œλ“€μ„ μ΄μš©ν•΄μ„œ 닡을 λ„μΆœν•΄λ‚Έλ‹€. 

f(n/2)+1

f(n/3)+1

f(n-1)+1

쀑 μ΅œμ†Ÿκ°’μ΄ f(n)의 값이 λœλ‹€. 

λΆˆν•„μš”ν•œ 연산을 μ—¬λŸ¬λ²ˆ ν•˜λŠ” 것을 막기 μœ„ν•΄ λ¦¬μŠ€νŠΈμ— μ—°μ‚°νšŸμˆ˜λ₯Ό μ €μž₯ν•΄λ†“λŠ”λ‹€. 

 

예λ₯Ό λ“€μ–΄ 10을 μž…λ ₯ν–ˆμ„ 경우 λ°°μ—΄ 인덱슀 1λΆ€ν„° 10κΉŒμ§€ 계산해 λ‚˜κ°„λ‹€. 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 

 x   0   1  1   2  3   2   3   3   2   3

 

이와 같이 μ €μž₯이 λœλ‹€. 

# DP 문제
# min(f(n/3)+1, f(n/2)+1, f(n-1)+1)

def main():
    n = int(input())

    count_list = [0 for _ in range(n + 1)]

    for i in range(1, n + 1):
        if i == 1:
            count_list[i] = 0
        else:
            count_list[i] = count_list[i - 1] + 1
            if i % 3 == 0 and count_list[i // 3] + 1 < count_list[i]:
                count_list[i] = count_list[i // 3] + 1
            if i % 2 == 0 and count_list[i // 2] + 1 < count_list[i]:
                count_list[i] = count_list[i // 2] + 1

    print(count_list[n])


if __name__ == '__main__':
    main()

 

μ½”λ“œλŠ” 이와 κ°™λ‹€.