문제
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
입력
- 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
- 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
입력 예제
2
출력 예제
1
문제 풀이
- i번째 인덱스의 값은 i를 1로 만드는 데 걸리는 횟수 이므로
- 맨 처음 1을 빼서 i값을 만드는 값을 i번째 인덱스에 넣는다.
- 그 후, 만약 i가 2나 3의 배수라면, 나누기 연산을 한 값이 최소 연산 횟수 일 것이므로, [i // 2], [i//3]번째 인덱스의 값에 1을 더해서 넣어준다.
- 따라서 점화식은 아래와 같다.
if (i % 3 == 0 or i % 2 == 0) dp[i] = min(dp[i], dp[i // 2] + 1 or dp[i // 3])
코드
n = int(input())
dp = [0] * 1000001
for i in range(2, n + 1):
dp[i] = dp[i - 1] + 1
if i % 3 == 0:
dp[i] = min(dp[i], dp[i // 3] + 1)
if i % 2 == 0:
dp[i] = min(dp[i], dp[i // 2] + 1)
print(dp[n])'Algorithm > Dynamic Programming' 카테고리의 다른 글
| [Python] 백준 1912번 연속합 (0) | 2023.02.10 |
|---|---|
| [Python] 백준 11053번 가장 긴 증가하는 부분수열 (0) | 2023.02.10 |
| [Python] 백준 1904번 01타일 (1) | 2023.02.09 |
| [Python] 편집거리 (0) | 2023.02.09 |
| [Python] 퇴사 (0) | 2023.02.08 |