Joon's Space
[Python] 백준 알고리즘 #1463 1로 만들기 본문
문제풀이
이번 문제도 dp를 이용하면 쉽게 풀린다. dp문제는 규칙을 찾고, 점화식을 먼저 구해준다.
n | 0 | 1 | 2 | 3 | 4 | 5 |
dp[n] | 0 | 0 | 1 | 1 | dp[2]+1 | dp[4]+1 |
n>=2 부터 2,3으로 나누었을 때, 나누어지는지에 대한 여부를 살펴보고, 조건문을 이용해서 dp값을 추가해준다.
dp[n] 의 값은
i) 2,3으로 모두 나누어질때는, dp[n//2], dp[n//3], dp[n-1] 에서 가장 작은 값 + 1
ii) 2로 나누어 떨어지고 3으로 나누어 떨어지지 않을 때, dp[n//2], dp[n-1] 에서 더 작은 값 +1
iii) 2로 나누어 떨어지지 않고, 3으로 나누어 떨어질 때, dp[n//3], dp[n-1] 에서 더 작은 값 +1
iv) 2,3 모두 나누어 떨어지지 않을 때, dp[n-1]+1
소스코드
import sys
input = sys.stdin.readline
dp = [0,0,1,1]
n = int(input())
for i in range(4,n+1):
if i%2==0 and i%3==0:
dp.append(min(dp[i//2],dp[i//3],dp[i-1])+1)
elif i%2==0 and i%3!=0:
dp.append(min(dp[i//2],dp[i-1])+1)
elif i%2!=0 and i%3==0:
dp.append(min(dp[i//3],dp[i-1])+1)
else:
dp.append(dp[i-1]+1)
print(dp[n])
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
반응형
'Algorithm > baekjoon' 카테고리의 다른 글
[Python] 백준 알고리즘 #2606 바이러스 (0) | 2021.02.28 |
---|---|
[Python] 백준 알고리즘 #1003 피보나치 함수 (0) | 2021.02.28 |
[Python] 백준 알고리즘 #1654 랜선 자르기 (0) | 2021.01.18 |
[Python] 백준 알고리즘 #2108 통계학 (0) | 2021.01.18 |
[Python] 백준 알고리즘 #2839 설탕 배달 (0) | 2021.01.18 |