728x90
반응형
다이나믹 프로그래밍 or 그래프 탐색 문제이다.
다이나믹 프로그래밍 풀이
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):
dp[i][0] = dp[i-1][0] + 1
dp[i][1] = dp[i-1][1] + [i]
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]
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]
print(dp[-1][0])
print(*dp[-1][1][::-1])
그래프 탐색(BFS) 풀이
입력이 1일 때만 주의해서 잘 처리해주면 된다.
from collections import deque
def bfs(node, dp):
q = deque()
q.append((node, dp))
while q:
node, dp = q.popleft()
for n in [node+1, node*2, node*3]:
if n <= N and check[n] == 0:
if n == N:
return check[node]+1, dp+[n]
q.append((n, dp+[n]))
check[n] = check[node]+1
N = int(input())
if N == 1:
print(0)
print(1)
else:
check = [0]*(N+1)
cnt, dp = bfs(1, [1])
print(cnt)
print(*dp[::-1])
728x90
반응형
'Agorithm > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 14697번 방 배정하기(python) (0) | 2021.03.21 |
---|---|
백준 알고리즘 2156번 포도주 시식(python) (0) | 2021.03.21 |
백준 알고리즘 15652번 N과 M (4)(python) (0) | 2021.03.20 |
백준 알고리즘 15651번 N과 M (3)(python) (0) | 2021.03.20 |
백준 알고리즘 15650번 N과 M (2)(python) (0) | 2021.03.20 |