동적계획법 개념을 익히고 난 후 처음으로 풀어보는 문제 : 백준 1463 (feat. Python)
정수 X에 사용할 수 있는 연산은 다음과 같이 3가지 이다.
정수 N이 주어졌을 때, 위와 같은 연산 세개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
일단, 동적 계획법은 모든 경우의 수에 대해서 알아보고 그 중 최적의 경로를 찾는 것이다. 이를 적용해보자.
입력에 대한 출력을 한번 나열해보자.
나열하면서 발견한 점은 큰 수의 경우 작은 수의 합산임을 알 수 있다. 이를 수정해서 다시 적어보면,
첫째 줄에 1보다 크거나 같고, 10^6보다 작거나 같은 정수 N이 주어진다.
메모이제이션을 이용하면 된다!
# 정수 input 값 받기
num = int(input())
# 메모
value = [0 for i in range(0, num + 1)]
value[1] = 0
for i in range(2, num+1):
value[i] = value[i - 1] + 1
if i % 2 == 0:
value[i] = min(value[i], value[i//2] + 1)
if i % 3 == 0:
value[i] = min(value[i], value[i//3] + 1)
print(value[num])