문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
문제 풀이
Botttom-Top 방식으로 각 수에 대한 계산값을 저장해나가며, 전의 결과를 다음 계산에 활용하는 DP 문제이다.
문제에서 주어진 연산에는 세 가지가 있다.
이 세 가지를 모두 검증해보고 가장 작은 값을 출력해주는 값을 n에 대한 출력값으로 지정해준다.
n = int(input())
dp = [0] * (n+1) ## 0과 1의 경우 출력값이 0이기 때문에 0을 초기값으로 세팅
for i in range(2, n+1):
dp[i] = dp[i-1] + 1
if i % 2 == 0:
dp[i] = min(dp[i], dp[i//2] + 1)
if i % 3 == 0:
dp[i] = min(dp[i], dp[i//3] + 1)
print(dp[n])
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[백준] 9465. 스티커 (0) | 2022.12.04 |
---|---|
[백준] 11726. 2×n 타일링 / 파이썬(python) (0) | 2022.05.18 |
[백준] 9095. 1, 2, 3 더하기 / 파이썬(python) (0) | 2022.05.18 |