다이나믹 프로그래밍의 조건
1. problem이 sub-problem으로 쪼개질 때.
2. sub-problem으로 problem을 구할 수 있을 때.
3. sub-problem이 겹칠 때.(값을 보관해서 중복을 없앤다.)
다이나믹 프로그래밍이므로 점화식으로 생각을 해야한다.
15가 나오면 3으로 나눠볼까? X
4가 나오면 2로 나눠볼까? X
일단 1부터 10까지의 수를 나열해놓고 하나씩 넣어서 최소 횟수를 구해보고 값의 관계를 살펴볼까? O
최단 횟수를 구해야하기 때문에 min( ?/3, ?/2, ?-1 )의 식을 활용할 수 있다.
11일 경우를 생각해보자.
4회: 11 - 1 = 10 -> -1을 하면 10이므로 10을 구한 것과 더하면 11을 구할 수 있다. (1+3)
3회: 10 - 1 = 9 -> -1을 하면 9이므로 9를 구한 것과 더하면 10을 구할 수 있다. (1+2)
2회: 9 / 3 = 3 -> 3으로 나누면 3이므로 3을 구한 것과 더하면 9를 구할 수 있다. (1+1)
1회: 3 / 3 = 1 -> 3까지는 구할 수 있으므로 미리 구해준다. ( 1->0 / 2->1 / 3->1 )
import math
def solve():
n = int(input())
arr = [0, 0, 1, 1]
for i in range(4, n+1):
one, two, three = math.inf, math.inf, arr[i-1]
if i % 3 == 0:
one = arr[i//3]
if i % 2 == 0:
two = arr[i//2]
value = 1 + min(one, two, three)
arr.append(value)
print(arr[n])
solve()
arr = [0, 0, 1, 1]
for i in range(4, n+1):
one, two, three = math.inf, math.inf, arr[i-1]
if i % 3 == 0:
one = arr[i//3]
if i % 2 == 0:
two = arr[i//2]
value = 1 + min(one, two, three)
arr.append(value)