기초적인 다이나믹 프로그래밍 문제였다. (근데도 푸는데 오래걸렸다.)
- 1
, / 2
, / 3
이 세가지를 이용하여 1을 만들 때 최소 연산 횟수를 구하는 문제다.
n을 1로 만들 때 오로지 - 1
만 사용하는 경우에 가장 연산을 많이한다.
총 n-1
번의 연산이 필요하다.
마찬가지로 n을 i로 만들 때 - 1
만 사용한다면 총 n-i
번의 연산을 해야한다.
그래서 리스트 dy[0]~dy[n]
를 n~0
으로 초기화하고 시작한다.
다음은 다시 리스트를 역으로 탐색하면서 - 1
, / 2
, / 3
을 이용해 숫자 i
를 만들 때 가장 적은 연산횟수를 저장해준다.
n = int(input())
dy = [n-i for i in range(n+1)]
for i in range(n, 0, -1):
if i % 2 == 0: dy[i//2] = min(dy[i//2], dy[i]+1, dy[i//2+1]+1)
if i % 3 == 0: dy[i//3] = min(dy[i//3], dy[i]+1, dy[i//3+1]+1)
print(dy[1])
기본 문제들부터 계속 연습해서 풀이 속도 높여야함