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 |