📌 이 문제는 해당 책에서 가져왔습니다.
문제 설명
26 -> 25 -> 5 -> 1
입력 조건
첫째 줄에 정수 X가 주어집니다.
출력 조건
첫째 줄에 연산을 하는 횟수의 최솟값을 출력합니다.
입력 예시 및 출력
문제 해결 아이디어
앞서 그리디 파트에서 다루었던 1이 될 때까지 문제와는 차이가 있음. 해당 변수가 어떤 값을 가지던 간에 1을 빼는 것보다 나누는 것이 1로 만드는 더 빠른 과정이기 때문에 최적의 값을 찾는 것이 그리디의 방법이었는데요.
현재 문제는 단순히 그리디의 방법으로 해결하기는 어렵습니다.
26의 경우도 1을 뺀 다음에 5로 두 번 나눠서 1을 만드는 방법이 3번 만에 1을 만드는 가장 빠른 방법이었는데요.
각 문제는 작은 문제를 조합해서 해결할 수 있기 때문에 최적 부분 구조를 갖고 있으며, 중복되는 부분 문제를 만족한다고 볼 수 있습니다.
)
코드 구현
# 1로 만들기 문제
# 정수 X를 입력 받기
x = int(input())
# 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화
d = [0] * 30001
# 다이나믹 프로그래밍 진행(바텀업)
for i in range(2, x+1):
# 현재의 수에서 1을 빼는 경우
d[i] = d[i-1] + 1
# 현재의 수가 2로 나누어 떨어지는 경우
if i % 2 == 0:
d[i] = min(d[i], d[i//2] + 1)
if i % 3 == 0:
d[i] = min(d[i], d[i//3] + 1)
if i % 5 == 0:
d[i] = min(d[i], d[i//5] + 1)
print(d[x])
입력
26
출력
3