[문제]
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
[풀이]
import sys
input = sys.stdin.readline
N = int(input())
result = [0 for _ in range(N+1)]
result[1]=0
for i in range(2, N+1):
result[i] = result[i-1]+1
if i%2==0:
result[i] = min(result[i//2]+1, result[i])
if i%3==0:
result[i] = min(result[i//3]+1, result[i])
print(result[N])
- 10에서 1을 빼면 9가 된다. 만약 9가 1이 되는 최소 횟수를 알고 있다면 (9가 1이되는 최소횟수) + 1(10에서 1을 빼 9로 갈 때 횟수)
- 10은 2로 나누어질 수 있다. (10을 2로 나눈 5가 1이 되는 최소 횟수) + 1(5에서 2를 곱해 10으로 갈 때 횟수)
- 결론적으로 점화식은 dp[n] = min(dp[n-1], dp[n//2], dp[n//3]) + 1이 된다.
'알고리즘 > 알고리즘 문제' 카테고리의 다른 글
[python] 프로그래머스 > 신규 아이디 추천 (0) | 2021.03.04 |
---|---|
[python] 백준 > 이중 우선순위 큐(7662) (0) | 2021.03.03 |
[python] 백준 > DFS > 유기농 배추(1012) (0) | 2021.03.01 |
[python] 백준 > DP > 피보나치함수(1003) (0) | 2021.03.01 |
[python] 프로그래머스 > 힙 > 더 맵게 (0) | 2021.02.27 |