문제
![](https://velog.velcdn.com/images%2Fcosmos%2Fpost%2Fa3eabd29-845c-44b6-839e-cba1e60b66e7%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-02-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.01.37.png)
풀이
- 모든 연산의 경우의 수 중에서 최적의 해를 구해야하는 문제이므로
다이나믹 프로그래밍
알고리즘을 활용하여 구하였다.
- 1로 만드는 과정을 나타낼 list를 하나 초기화하였으며 무조건 마지막에는 1이 만들어져야하므로 첫번째 인덱스에 1을 할당하였다.
- list = list[해당 조건문] + [i] 로 -1, //2, //3 의 과정을 list에 담을 수 있다.
botto-up
방식으로 구현하혔다.
코드
import sys
input = sys.stdin.readline
def dp(n):
d = [0] * 1000001
result = [0] * 1000001
result[1] = [1]
for i in range(2, n+1):
d[i] = d[i-1] + 1
result[i] = result[i-1] + [i]
if i % 2 == 0 and d[i//2] + 1 < d[i]:
d[i] = d[i//2]+1
result[i] = result[i//2] + [i]
if i % 3 == 0 and d[i//3] + 1 < d[i]:
d[i] = d[i//3]+1
result[i] = result[i//3] + [i]
print(d[n])
print(*sorted(result[n], reverse=True))
if __name__ == '__main__':
n = int(input())
dp(n)
결과
![](https://velog.velcdn.com/images%2Fcosmos%2Fpost%2Ff1dc63f3-f8ef-4c7a-a484-eb9b893635e9%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-02-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.22.56.png)
출처 & 깃허브
BOJ 12852
github