문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
예제 입력5 17 |
예제 출력4 |
힌트
수빈이가 5-10-9-18-17 순으로 가면 4초만에 동생을 찾을 수 있다.
풀이
BFS를 통해 두 사람이 만나기까지의 최저 소요 시간을 구하는 문제이다.
코드가 어떻게 순차적으로 작동하는지부터 예제를 통해 살펴보도록 하자.
1차원 배열(이하 visit)의 각각의 좌표는 BFS로 방문한 순서이다.
코드는 visit[k]가 구해지면 종료되도록 했다.
위의 visit[k]가 5이므로, visit[n]부터 이동하는데 총 4초가 걸린 것이다.
BFS 문제인 만큼 큐 활용이 중요하다. (필자는 편의상 덱을 큐처럼 사용했다)
우선 시작점을 큐에 넣어두고 진행한다.
그리고 while문을 돌며 큐에 남아있는 것들을 모두 pop하며
pop된 원소가 X라면, X-1, X+1, X*2 좌표가 0일 시 현재 틱으로 교체해준다.
반드시 현재 큐에 들어있는 좌표를 모두 다 써버린 뒤 다음 틱으로 넘어가야 한다.
큐가 비었다면, 현재 틱에서 새로 바꿔주었던 좌표들을 모두 큐에 넣어준다.
그리고 위의 과정을 반복한다.
from collections import deque
n,k = map(int,input().split())
deq, visit = deque(), [0 for i in range(100001)]
deq.append(n); visit[n] = 1
t = 1
while(visit[k]==0):
t += 1; temp = []
# 현재 큐를 모두 비울때까지 반복
while(deq):
p = deq.popleft()
for i in p-1,p+1,p*2:
if i >= 0 and i < 100001 and visit[i] == 0:
visit[i] = t
temp.append(i)
# 큐가 비었으니 위에서 교체한 좌표들을 새로 넣어준다
deq = deque(temp)
print(t-1)
'알고리즘 연습 > DFS와 BFS' 카테고리의 다른 글
[🥇4 / 백준 2206 / 파이썬] 벽 부수고 이동하기 (0) | 2021.08.10 |
---|---|
[🥈2 / 백준 7562 / 파이썬] 나이트의 이동 (0) | 2021.08.08 |
[🥈1 / 백준 7569 / 파이썬] 토마토 (0) | 2021.08.07 |
[🥈1 / 백준 7576 / 파이썬] 토마토 (0) | 2021.08.06 |
[🥈1 / 백준 2178 / 파이썬] 미로 탐색 (0) | 2021.08.06 |