알고리즘/BFS&DFS

백준 16953 (bfs)

mimi04 2024. 1. 28. 16:33

 

from collections import deque

a, b = map(int, input().split())

q = deque([(a, 1)])

while q:
    now, cnt = q.popleft()
    if now == b:
        print(cnt)
        break
    if now * 2 <= b:
        q.append((now * 2, cnt + 1))
    if now * 10 + 1 <= b:
        q.append((now * 10 + 1, cnt + 1))
else:
    print(-1)

 

이 문제는 구현으로 풀어도 되지만 bfs로 풀이를 해보았다.

구현으로 풀 시에는 top-down방식으로 b->a 로 풀어나가야 하지만, bfs풀이로는 bottom-up 방식으로 a -> b로 풀어가면 된다.

큐에 a값과 연산횟수값(처음1)을 넣어주고 시작한다.

popleft()로 큐의 값이 있을 때 빼주어 현재값을 now에, 연산횟수를 cnt에 저장한다.

now값과 b값을 비교하며 b값과 같으면 바로 연산횟수cnt를 출력하고 종료.

아니면, now값에 2를 곱한 값 또는 뒤에 1을 붙인 값(now * 10 + 1)이 b와 같거나 작을 때 큐에 넣어준다. (cnt값 + 1)

그렇게 now값이 b값과 같아질 때까지 반복해준다.

끝난 후 값이 같아지지 않는다면, -1을 출력한다. 

반응형