문제
코드
from collections import deque
def bfs(n):
q = deque([(n, 0)])
visited = set([n])
while q:
cur, count = q.popleft()
if cur == 1:
return count
if cur % 3 == 0 and (cur // 3) not in visited:
q.append((cur // 3, count + 1))
visited.add(cur // 3)
if cur % 2 == 0 and (cur // 2) not in visited:
q.append((cur // 2, count + 1))
visited.add(cur // 2)
if (cur - 1) not in visited:
q.append((cur - 1, count + 1))
visited.add(cur - 1)
return -1
n=int(input())
print(bfs(n))
풀이
- n을 입력받는다.
- 입력받은 n을 bfs함수에 넣고 돌려준다. 문제에서 주어진 조건을 만족하면 q에 넣는다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
- 단 n의 크기가 최대 10^18로 엄청 크다. 그러므로 최대한 중복된 값을 탐색하지 않기 위해서 visited라는 set()을 선언한다.
- 매번 얻는 값들을 visited에 넣어주고, bfs 시행 시 조건을 만족해도 visited에 있는 수들은 q에 넣지 않는다.(중복을 피한다)
- 1이 되면 횟수를 return한다.