문제.
풀이.
최솟값과 경로를 담는 dp 배열을 생성해서
연산마다 최솟값과 경로를 배열에 담아준다.
그리고 경로를 뒤집어서 출력하면 된다.
소스코드.
import sys
input = sys.stdin.readline
n = int(input())
dp = [[0, []] for _ in range(n + 1)]
dp[1][0] = 0 # 최소값
dp[1][1] = [1] # 경로를 담는 리스트
for i in range(2, n+1):
# x -1
dp[i][0] = dp[i-1][0] + 1
dp[i][1] = dp[i-1][1] + [i]
# x // 3
if i % 3 == 0 and dp[i // 3][0] + 1 < dp[i][0]:
dp[i][0] = dp[i//3][0] + 1
dp[i][1] = dp[i//3][1] + [i]
# x // 2
if i % 2 == 0 and dp[i//2][0] + 1 < dp[i][0]:
dp[i][0] = dp[i//2][0] + 1
dp[i][1] = dp[i//2][1] + [i]
print(dp[n][0])
for i in dp[n][1][::-1]:
print(i, end=' ')
'프로그래밍 > 백준' 카테고리의 다른 글
백준 14003 가장 긴 증가하는 부분 수열 5 - 파이썬 (0) | 2021.08.02 |
---|---|
백준 14002 가장 긴 증가하는 부분 수열 4 - 파이썬 (0) | 2021.08.02 |
백준 1644 소수의 연속합 - 파이썬 (0) | 2021.07.29 |
백준 11066 파일 합치기 - 파이썬 (0) | 2021.07.29 |
백준 9370 미확인 도착지 - 파이썬 (0) | 2021.07.29 |