문제
X가 주어질 때, 5, 3, 2로 나누거나 1을 빼서 결과적으로 1을 만들 때,
가장 최소의 연산의 수로 1을 만들어라
유형 파악 및 구현
전형적인 DP문제이다.
예전에 구한 값이 지금 현재 구하고자 하는 값에 영향을 준다
예를 들어, 26을 1로 만든다고 생각을 해보자
- 26은 5나 3으로는 나누어지지 않는다.
- 26은 2로 나누거나 1을 뺄 수 있다.
이 때,
2로 나누는 경우 - 13에서 1을 만들기 위한 최소한의 연산의 수 + 1
1을 빼는 경우 - 25에서 1을 만들기 위한 최소한의 연산의 수 + 1
즉, 13 또는 25를 1로 만들기 위해 사용되는 연산의 수 + 1을 하고 둘 중 작은 값이 정답이 된다.
x 를 1로 만드는 횟수
1 : 0
2 : min(2//2를 1로 만드는 횟수+1 , 2-1을 1로 만드는 횟수 + 1 )
....
...
8 : min( 8//2, 즉 4를 1로 만들기 위한 횟수 + 1, 8-1 즉 7을 1로 만들기 위한 연산의 횟수 + 1)
코드
n = int(input())
INF = 1e9
check = [INF]*(n+1)
check[1] = 0
check[2] = 1
for i in range(3, n+1):
if i % 2 == 0:
check[i] = min(check[i], check[i//2]+1)
if i % 3 == 0:
check[i] = min(check[i], check[i//3]+1)
if i % 5 == 0:
check[i] = min(check[i], check[i//5]+1)
check[i] = min(check[i], check[i-1]+1)
print(check[n])
'Algorithm > Dynamic Programming' 카테고리의 다른 글
금광 (0) | 2023.04.11 |
---|---|
효율적인 화폐 구성 (0) | 2023.04.11 |
바닥공사 (0) | 2023.04.11 |
개미전사 (0) | 2023.04.11 |
Dynamic Programming - Concept (0) | 2023.04.11 |