문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
풀이
지금 BFS, DFS를 공부한지 얼마 안돼서 어떤걸로 풀어야 할지 감이 잘 안잡혔다. DFS가 익숙했기 때문에 DFS로 풀어보려 했지만 깊이보다는 너비로 탐색하는게 효율적이라고 생각했다. 일정한 길이이기도 하고 queue에 넣는게 더 빠르다고 생각했다.
이 문제의 핵심이라고 생각되는 것은 현재 위치와 count를 함께 저장하는 것이라고 생각한다.!!
# 1697 숨바꼭질
import sys
from collections import deque
input = sys.stdin.readline
def bfs(v):
count = 0
queue = deque([[v, count]])
while queue:
v = queue.popleft()
pos = v[0]
count = v[1]
if not visited[pos]:
visited[pos] = True
if pos == K:
return count
count += 1
if (pos * 2) <= 100000:
queue.append([pos * 2, count])
if (pos + 1) <= 100000:
queue.append([pos + 1, count])
if (pos - 1) >= 0:
queue.append([pos - 1, count])
return count
N, K = map(int, input().split())
visited = [False] * 100001
print(bfs(N))
visited가 False인 경우에만 접근하며 queue를 사용하는 너비 탐색이기에 최단 거리를 구하는데 아주 좋은 알고리즘이다.
배운점
최단 거리를 탐색하고 깊이가 따로 없을 경우에는 dfs보다는 bfs를 생각해보자!!
bfs에도 익숙해지자!
'Algorithm(알고리즘) > BOJ(백준) 문제풀이' 카테고리의 다른 글
백준 1003번 파이썬 | 피보나치 함수 (DP) (0) | 2020.11.01 |
---|---|
백준 2178번 파이썬 | 미로탐색 (BFS 탐색문제) (0) | 2020.10.31 |
백준 2667번 파이썬 | 단지번호붙이기 (DFS 연결노선 찾기문제) (0) | 2020.10.31 |
백준 1260번 파이썬 | DFS와 BFS (0) | 2020.10.30 |
백준 1644번 파이썬 | 소수의 연속합 (0) | 2020.10.28 |