πŸ“‚μ½”λ”©ν…ŒμŠ€νŠΈ:CodingTest

[λ°±μ€€ 1463번-파이썬]1둜 λ§Œλ“€κΈ°

mc.thd 2023. 6. 20. 17:30

λ°±μ€€ (BOJ) 1463번
https://www.acmicpc.net/problem/1463

μ‚¬μš©μ–Έμ–΄ : PYTHON

1.문제

image

2.풀이

λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° (Bottom up) λ°©μ‹μœΌλ‘œ ν’€μ–΄μ•Ό ν–ˆλ‹€.

2-1.μˆœν™˜μ‹μ„ μ„Έμš°κΈ°

μˆœν™˜μ‹μ„ μ„Έμš°λŠ” μ‚¬κ³ μ˜ μΆœλ°œμ μ€ 'μ΅œμ ν•΄μ˜ 일뢀뢄이 κ·Έ 뢀뢄에 λŒ€ν•œ μ΅œμ ν•΄μΈκ°€?' 라고 λ°°μ› λ‹€.
μ •μˆ˜ N을 1둜 λ§Œλ“œλŠ” μ΅œμ†Œ 횟수λ₯Ό κ΅¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό D(N)이라고 ν•˜μž.

μ΅œμ ν•΄λ₯Ό 생각해보면 λ‹€μŒκ³Ό κ°™λ‹€.
image
D(10)은 10을 2둜 λ‚˜λˆˆ D(5)와, 10μ—μ„œ 1을 λΊ€ D(9)쀑 더 μž‘μ€ κ°’ + 2둜 λ‚˜λˆ„κ±°λ‚˜ 1을 λΊ€ μ—°μ‚°νšŸμˆ˜ 1κ³Ό κ°™λ‹€.
D(12)λŠ” 12λ₯Ό 3으둜 λ‚˜λˆˆ D(4)와, 12λ₯Ό 2둜 λ‚˜λˆˆ D(5), 12μ—μ„œ 1을 λΊ€ D(11) 쀑 더 μž‘μ€κ°’ + μ—°μ‚°μ˜ 횟수 1κ³Ό κ°™λ‹€.

'μ΅œμ ν•΄μ˜ 일뢀뢄이 κ·Έ 뢀뢄에 λŒ€ν•œ μ΅œμ ν•΄μΈκ°€?'에 λŒ€ν•΄μ„œ 생각해보면
μ΅œμ ν•΄D(10)의 일뢀뢄 D(5), D(9)λŠ” κ·Έ 뢀뢄에 λŒ€ν•œ μ΅œμ ν•΄κ°€ λ§žλ‹€.
μ΅œμ ν•΄D(12)의 일뢀뢄 D(4), D(5), D(11)도 κ·Έ 뢀뢄에 λŒ€ν•œ μ΅œμ ν•΄κ°€ λ§žλ‹€.

이제 μˆœν™˜μ‹μ„ μ„Έμ›Œλ³΄μ•˜λ‹€.
image
μ—¬κΈ°μ„œ μ£Όμ˜ν•΄μ•Ό ν•  점이 μžˆλŠ”λ° n이 3 λ˜λŠ” 2둜 λ‚˜λˆ λ–¨μ–΄μ Έμ•Ό D(n//3) λ˜λŠ” D(n//2)λ₯Ό ν•  수 μžˆλ‹€.

2-2.base case둜 μˆ˜λ ΄ν•˜λŠ”μ§€ 확인

μœ„ κ·Έλ¦Όμ—μ„œ D(n//3), D(n//2), D(n-1)은 base case인 n==1μ΄λ‚˜ n==2둜 μˆ˜λ ΄ν•œλ‹€.

2-3.μˆœν™˜μ‹μ„ 계산

image
bottom-up 방식(μˆœν™˜μ‹μ˜ 였λ₯Έμͺ½μ— λ“±μž₯ν•˜λŠ” 값이 μ™Όμͺ½μ— λ“±μž₯ν•˜λŠ” 값보닀 λ¨Όμ € 계산)으둜 연산을 ν•˜λ €λ©΄ 빨간색 ν™”μ‚΄ν‘œμ™€ 같이 인덱슀 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ κ³„μ‚°ν•˜λ©΄ λœλ‹€.

3.μ½”λ“œ

μˆœν™˜μ‹μ„ bottom-up λ°©μ‹μœΌλ‘œ κ³„μ‚°ν•˜κΈ° μœ„ν•΄μ„œ for문을 μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
μ΄λ•Œ -1μ—°μ‚° d[i] = 1 + d[i-1]은 μ–΄λ–€ μ •μˆ˜μ΄λ˜μ§€ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 제일 처음 μˆ˜ν–‰ν•˜λ„λ‘ μž‘μ„±ν–ˆλ‹€.
λ‹€μŒμœΌλ‘œ 3λ˜λŠ” 2둜 λ‚˜λˆ„λŠ” 연산은 iκ°€ 3λ˜λŠ” 2둜 λ‚˜λˆ λ–¨μ–΄μ Έμ•Ό ν•˜κΈ°λ•Œλ¬Έμ— if문으둜 검사λ₯Ό 해쀬닀.
μΆ”κ°€λ‘œ min값을 κ΅¬ν•˜κΈ° μœ„ν•΄ if문에 and 쑰건으둜 크기λ₯Ό λΉ„κ΅ν–ˆλ‹€.

import sys
input = sys.stdin.readline

N=int(input())

d=[0]*(N+1)


for i in range(1,N+1):
    if i==1:
        d[i]=0
    elif i==2:
        d[i]=1
    else:
        d[i] = 1 + d[i-1]
        if i%3==0 and d[i]>1+d[i//3]:
            d[i]=1+d[i//3]
        if i%2==0 and d[i]>1+d[i//2]:
            d[i]=1+d[i//2]

print(d[N])