Coding/백준
[백준] 1697 - 숨바꼭질(BFS) - (python 파이썬)
Coding Kitsune
2022. 2. 17. 13:02
문제링크 : https://www.acmicpc.net/problem/1697
1697번: 숨바꼭질
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
풀이과정 :
처음에는 동적프로그래밍으로 접근해보다가 빙빙 돌다가,, BFS 알고리즘임을 알게되었고,
BFS를 다시 공부하고 풀었다. 가장 기본적인 BFS 문제이며, 파이쎁 같은 경우 BFS는 양쪽
입출력이 모두 가능한 덱으로 구현해야한다. 코드리뷰를 하자면, 범위 값을 잡아주고
범위 안의 방문처리 리스트(몇번 이동이 있었는지)를 만들어준다. 그 뒤로 덱의 왼쪽
인자를 출력해주면서 그것이 K의 위치와 같은지 계속해서 확인해주고,
X-1, X+1, X*2 로 차례로 이동해주면서 최단거리를 구하는 알고리즘을 구현하면된다.
from collections import deque
def bfs(N, K):
dq = deque()
dq.append(N)
while dq:
temp = dq.popleft()
if K == temp:
print(dlst[temp])
break
for i in (temp-1, temp+1, temp*2):
if 0<= i <= MAX and not dlst[i]: #범위내의 이동이면서, 처음방문하는곳에 한하여
dlst[i] = dlst[temp] + 1
dq.append(i)
MAX = 100000
N, K = map(int, input().split())
dlst = [0] * (MAX+1) #방문처리 리스트
bfs(N, K)
후기 : BFS를 학교수업 때 이후로 처음 만나서 이해하는데 다소 시간이 걸렸다.