알고리즘 문제풀이/백준
[벡준 1697번] 숨바꼭질 - 파이썬(python)
mine*
2023. 6. 28. 21:52
1697번: 숨바꼭질
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
분류
- 그래프 이론
- 그래프 탐색
- 너비 우선 탐색
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
풀이
- 입력받은 수 n에서 k까지 이동하는데 걸린 시간을 구하는 문제이다.
- 이동할 수 있는 방법은 x-1, x+1, x*2 이렇게 3가지의 방법이 있다.
- 따라서 n의 범위인 100001까지 방문배열을 만들고 방문체크해나가며 동생의 위치에 도달했을 때 리턴한다. (방문배열의 k에 있는 수가 정답)
코드
from collections import deque
def bfs(n, k):
q = deque()
q.append(n)
while q:
x = q.popleft()
# 동생의 위치에 도달하면 리턴
if x == k:
return visit[x]
# 현재좌표에서 갈수있는 모든 경우 x-1, x+1, 2*x를체크하고 q에 넣기
for i in (x-1, x+1, 2*x):
if 0 <= i <= 100000 and visit[i]==0:
visit[i] = visit[x] + 1
q.append(i)
n, k = map(int, input().split())
# n의 범위에 따른 방문 배열
visit = [0] * 100001
print(bfs(n, k))