728x90
반응형
import sys
input = sys.stdin.readline
x = int(input())
d = [0] * (x + 1)
path = ['' for _ in range(x + 1)]
path[1] = '1'
for i in range(2, x + 1):
d[i] = d[i - 1] + 1
prev = i - 1
if i % 3 == 0 and d[i // 3] + 1 < d[i]:
d[i] = d[i // 3] + 1
prev = i // 3
if i % 2 == 0 and d[i // 2] + 1 < d[i]:
d[i] = d[i // 2] + 1
prev = i // 2
path[i] = str(i) + " " + path[prev]
print(d[x])
print(path[x])
1로 만들기 문제를 업그레이드한 문제이다. 1로 만들기 -> https://yskisking.tistory.com/197
문제 자체는 같지만 x가 나눠지는 과정을 추가로 출력해야 한다.
2, 3, 4, 5... x 까지 올라가면서 그때그때 나눠지는 과정을 path 리스트에 기록해 두면 된다.
d는 최소연산횟수를 담을 리스트
path는 나눠지는 과정을 담을 리스트이다. 참고로 인덱스 i에 대한 값은 , 숫자 i에 대한 나눠지는 과정이다. 각 인덱스마다 해당 숫자의 나눠지는 과정이 일일이 담겨 있다.
이번 반복문에서는 d[i]값만 갱신하지 않고 prev 변수에 i의 변화를 함께 담아둔다. 참고로 저번처럼 min을 사용하면 어떤 값이 선택되었는지 다시 한번 확인해야 하기 때문에 조건문에서 d[i//3] + 1 < d[i] 와 같은 과정을 함께 처리했다.
d[i]값 갱신이 끝났다면 현재 숫자와 path[prev] 에 담겨있는 나눠지는 과정을 합쳐서 path[i]에 저장한다.
이렇게 하면 문제를 해결할 수 있다.
728x90
반응형
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[Baekjoon 9251 / python / 골드5] LCS (0) | 2024.04.07 |
---|---|
[Baekjoon 9084 / python / 골드5] 동전 (0) | 2024.04.06 |
[Baekjoon 1904 / python / 실버3] 01타일 (0) | 2024.04.05 |
[Baekjoon 2748 / python / 브론즈1] 피보나치 수 2 (0) | 2024.04.05 |
[Baekjoon 1463 / python / 실버3] 1로 만들기 (0) | 2024.04.05 |