from collections import deque
N = int(input())
if N == 1:
print(0)
print(1)
else:
dp_dict = {N:-1}
stack = [N]
cnt = 0
while stack:
new_stack = []
for num in stack:
if not (num%3 or dp_dict.get(num//3)):
dp_dict[num//3] = num
new_stack.append(num//3)
if not (num%2 or dp_dict.get(num//2)):
dp_dict[num//2] = num
new_stack.append(num//2)
if not dp_dict.get(num-1) and num>1:
dp_dict[num-1] = num
new_stack.append(num-1)
cnt += 1
if 1 in new_stack:
break
stack = new_stack[:]
result = []
find_num = 1
print(cnt)
while True:
result.append(find_num)
find_num = dp_dict[find_num]
if find_num == -1:
break
result.reverse()
print(*result)
방식은 간단하다. 나눠지고, 해당 값이 최초로 방문했을때에만 new_stack에 넣어주고,
그때의 위치정보를 dictionary에 저장시켜준다.
그리고 1에 도착하면 역으로 추적해가면서 최초의 숫자가 나올때까지 반복을 해주면 되는 문제이다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 14950 정복자 (0) | 2021.06.06 |
---|---|
[BOJ/백준] 14725 개미굴 (0) | 2021.06.06 |
[BOJ/백준] 12764 싸지방에 간 준하 (0) | 2021.06.06 |
[BOJ/백준] 11085 군사이동 (3) | 2021.06.06 |
[BOJ/백준] 10421 수식 완성하기 (0) | 2021.06.06 |