문제
정수 X가 주어질때 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지이다.
1) X가 5로 나누어떨어지면, 5로 나눈다.
2) X가 3으로 나누어 떨어지면, 3으로 나눈다.
3) X가 2로 나누어 떨어지면, 2로 나눈다.
4) X에서 1을 뺀다.
정수 X가 주어졌을때, 연산 4개를 적절히 사용해서 1을 만들어야한다. 이 연산을 사용하는 횟수의 최솟값을 출력해라.
입력 조건
- 첫째 줄에 정수 X가 주어진다. (1 <= X <= 30,000)
출력 조건
- 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
입력 예시
26
출력 예시
1
Solution
함수가 호출되는 과정을 그림으로 그려보자.
그럼 위와 같이 같은 함수들이 동일하게 여러 번 호출되는 것을 알 수 있다. 이 문제에서 동일한 함수에서 구하는 값들은 동일해야 하므로 다이나믹 프로그래밍을 효과적으로 사용할 수 있다.
점화식을 작성해보면 위와 같고 이 식을 토대로 바텀업 다이나믹 프로그래밍으로 코드를 작성해보자.
x = int(input())
dp = [0] * 30001
# 네가지 경우 중에서 가장 작은 것을 dp[i]에 대입
for i in range(2, x + 1):
# 현재의 수에서 1을 빼는 경우
dp[i] = dp[i - 1] + 1
# 현재의 수가 2로 나누어 떨어지는 경우
if i % 2 == 0:
dp[i] = min(dp[i], dp[i//2] + 1)
# 현재의 수가 3으로 나누어 떨어지는 경우
if i % 3 == 0:
dp[i] = min(dp[i], dp[i//3] + 1)
# 현재의 수가 5로 나누어 떨어지는 경우
if i % 5 == 0:
dp[i] = min(dp[i], dp[i//5] + 1)
print(dp[x])
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[Algorithm] 최장 증가 부분 수열(LIS) (0) | 2023.02.23 |
---|---|
[Algorithm] Dynamic Programming (동적 계획법) (2) | 2023.02.18 |