더 작은 문제들을 해결하면서 큰 문제의 답을 찾기
문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
나의 풀이
처음에는 if문을 통해 분기하는 방식으로 해결하려 했습니다. 그러나 이 방식은 어떤 연산을 먼저 해야만 최소의 결과를 내는지 알기가 어렵습니다.
모든 결과에 대해 재귀로 푸는 것은 시간 복잡도가 너무 커지므로 이런 경우에는 다이나믹 프로그래밍을 이용해야 합니다.
다이나믹 프로그래밍이란 커다란 문제를 부분적인 문제로 쪼개서 해결하는 것을 의미합니다.
d = [0 for _ in range(1000001)]
d[1] = 0
if __name__ == "__main__":
n = int(input())
for i in range(2, n + 1):
d[i] = d[i - 1] + 1
if i % 2 == 0 and d[i] > (d[i // 2] + 1):
d[i] = d[i // 2] + 1
if i % 3 == 0 and d[i] > (d[i // 3] + 1):
d[i] = d[i // 3] + 1
print(d[n])
댓글남기기