문제 링크
https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
문제 설명
문제 풀이
Dynamic Programming 문제이다.
dp 테이블에 모든 원소를 0으로 초기화시켜준 후 하나씩 반복하여 계산을 하는 것이다.
DP는 처음에는 이해가 잘 안되는데 생각해보면 간단하다.
예를 들어 4에 대한 연산의 결과를 생각해보자.
4는 4 -> 2 -> 1 의 연산을 하게된다.
그런데 이걸 하나씩 매번 해줄 필요가 없다.
2에 대한 연산의 횟수(DP(2))에 2를 도출해낸 연산(나누기 2) 한 번(+1)을 카운트해주면
DP[4] = DP[2] + 1이 된다.
이와 같은 방식으로 코드를 작성하면 된다.
최소 횟수로 연산을 완성시켜야 하므로 최솟값을 구하는 연산이 필요하게 된다.
-1을 하는 연산을 작성하고 2로 나누어지는 경우와 3으로 나누어지는 경우를 if문으로 구현하여
그 중에서 횟수의 최솟값을 구하면 된다.
x = int(input())
dp = [0] * (x + 1)
for i in range(2, x + 1):
dp[i] = dp[i - 1] + 1
if i % 2 == 0:
dp[i] = min(dp[i], dp[i//2] + 1)
if i % 3 == 0:
dp[i] = min(dp[i], dp[i//3] + 1)
print(dp[x])
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 1699 제곱수의 합 (파이썬 python) (0) | 2022.01.19 |
---|---|
[백준] 2579 계단 오르기 (파이썬 python) (0) | 2022.01.18 |
[백준] 2156 포도주 시식 (파이썬 python) (0) | 2022.01.18 |
[백준] 9465 스티커 (파이썬 python) (0) | 2022.01.18 |
[백준] 11718 그대로 출력하기 (파이썬 python) (0) | 2022.01.14 |