정수 X가 주어질 때 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지이다.
- X가 5로 나누어떨어지면, 5로 나눈다.
- X가 3으로 나누어떨어지면, 3으로 나눈다.
- X가 2로 나누어떨어지면, 2로 나눈다.
- X에서 1을 뺀다.
정수 X가 주어졌을 때, 연산 4개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
예를 들어 정수가 26이면 다음과 같이 계산해서 3번의 연산이 최솟값이다.
1. 26 - 1 = 25 (4)
2. 25 / 5 = 5 (1)
3. 5 / 5 = 1 (1)
입력 조건
- 첫째 줄에 정수 X가 주어진다. (1 <= X <= 30,000)
출력 조건
- 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
반복문을 통해 DP테이블에 이전에 계산했던 값들을 저장하면서 정답을 구하는 Bottom - UP방식으로 문제를 풀었다.
현재의 수에서 문제에서 주어진 4가지 연산들 중 어떤 것을 택했을 때 연산을 하는 횟수가 최소가 되는지 구해서 DP테이블에 담았다.
import sys
x = int(sys.stdin.readline().rstrip())
# DP 테이블 초기화
dp = [0] * 30001
for i in range(2, x + 1):
# 현재의 수에서 1을 빼는 경우
dp[i] = dp[i - 1] + 1
# 현재의 수가 5의 배수인 경우
if i % 5 == 0:
dp[i] = min(dp[i], dp[i // 5] + 1)
# 현재의 수가 3의 배수인 경우
elif i % 3 == 0:
dp[i] = min(dp[i], dp[i // 3] + 1)
# 현재의 수가 2의 배수인 경우
elif i % 2 == 0:
dp[i] = min(dp[i], dp[i // 2] + 1)
# 결과 출력
print(dp[x])