[동적 계획법] 1로 만들기

2021. 11. 14. 14:20백준

다른 사람들의 풀이를 보니, 메모이제이션으로 쉽게 풀 수 있는걸 너무 복잡하게 생각한 것 같다.

 

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

 

from sys import stdin

N = int(stdin.readline())

m = {1: 0}


def check(no):
    global m
    if no <= N and no not in m:
        m[no] = 0
        return True
    return False


pre = [1]
count = 0
while True:
    if N == 1:
        break

    pre_new = []
    count += 1
    for i in pre:
        if check(i * 2):
            pre_new.append(i * 2)
        if check(i * 3):
            pre_new.append(i * 3)
        if check(i + 1):
            pre_new.append(i + 1)

    pre = pre_new

    if N in m:
        break

print(count)