X = int(input())

dp = [X]
cnt = 0

while(True):
    if(1 in dp):
        print(cnt)
        break
    calc = []
    for i in dp:
        if(i % 2 == 0):
            calc.append(i / 2)
        if(i % 3 == 0):
            calc.append(i / 3)
        calc.append(i - 1)
    dp = calc

    cnt += 1
# 내가 푼건 dp방법이 아닌 것 같아 아래 코드를 붙임
# https://chunghyup.tistory.com/49 참고함
def min(x, y):
    return x if x <= y else y
 
x = int(input())
 
minimum_count = [0 for _ in range(x+1)]
 
index = 0
while(True):
    if index > x:
        break
 
    if index <= 1:
        minimum_count[index] = 0
    else:
        temp_min = x + 1
        if index % 3 == 0:
            temp_index = int(index/3)
            temp_min = min(temp_min, minimum_count[temp_index])
 
        if index % 2 == 0:
            temp_index = int(index/2)
            temp_min = min(temp_min, minimum_count[temp_index])
 
        temp_min = min(temp_min, minimum_count[index-1])
        minimum_count[index] = int(temp_min + 1)
    index = index + 1
    
print(minimum_count[x])

위의 코드는 0, 1 까지는 연산 횟수가 0이므로 일단 0을 채워준다.

미리 계산해놓은 인덱스(숫자 값)를 이용하여 최댓값을 구하는 방식.

점화식은 해당 리스트에서 min(/2, /3, -1) + 1이 된다. -> temp_min이 이 부분을 계산해주고 있음. 

마지막에 index = index + 1을 이용하여 점점 x값에 다가가게 됨.

 

'# 코딩 문제 관련 > 파이썬' 카테고리의 다른 글

백준 10844번(python)  (0) 2019.08.16
백준 10989번(python)  (0) 2019.08.10
백준 2579번(python)  (0) 2019.08.10
백준 1932번(python)  (0) 2019.08.05
백준 1149번(python)  (0) 2019.08.05