728x90
https://www.acmicpc.net/problem/1463
전형적인 dp유형의 문제로 입력값이 1000000개, 백만개로로 적은편이기때문에 더욱이 dp로 풀어야하는 문제임을 알 수 있다.
점화식을 찾아보자
array[1] = 0
array[2] = min(array[1] + 1, array[2//2] + 1)
array[3] = min(array[2] + 1, array[3//3] + 1)
array[4] = min(array[3] + 1, array[4//2] + 1)
array[5] = array[4] + 1 //2와 3으로 나누어 지지 않는 경우
array[6] = min(array[5] + 1, array[6//3] + array[3])
array[7] = array[6] + 1
array[8] = min(array[7] + 1, array[8//2] + 1)
array[9] = min(array[8] + 1, array[9//3] + 1)
array[10]= min(array[9] + 1, array[10//2] + 1)
멋지게 한줄로 적진 못하겠지만 계속 규칙적인 식이 나온다는 것을 알 수 있다.
n = int(input())
array = [0] * 1000001 #입력값의 개수만큼 배열 생성 n+1개로 생성해도 무관
for i in range(2, n + 1):
array[i] = array[i-1] + 1 #2와 3으로 나누어지지 않는 경우
if i % 2 == 0:
array[i] = min(array[i], array[i//2] + 1)
if i % 3 == 0: # 2와 3의 공배수가 있기 때문에 elif를 사용하면 안됨
array[i] = min(array[i], array[i//3] + 1)
print(array[n])
728x90
반응형
'Coding Test' 카테고리의 다른 글
백준 2805 - 나무 자르기( Python ) (0) | 2023.01.06 |
---|---|
백준 1920 - 수찾기( Python ) (0) | 2023.01.04 |
백준 11727 - 2×n 타일링 2 (Python) (0) | 2022.12.19 |
백준 17478 - 재귀함수가 뭔가요? (0) | 2022.12.17 |
백준 1439 - 뒤집기 ( Python ) (0) | 2022.12.09 |