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을 출력한다.
반응형
'알고리즘 > BFS&DFS' 카테고리의 다른 글
백준 24479 시간초과 해결 (DFS) (0) | 2024.01.30 |
---|---|
백준 11725 트리의 부모 찾기 (0) | 2024.01.28 |
백준11724 (0) | 2024.01.23 |
[BFS&DFS기본] 백준1260번 (Python) (0) | 2024.01.22 |
백준 2644(촌수 계산) -BFS (0) | 2023.08.24 |