알고리즘 공부/BFS & DFS
[백준] 1697번 숨바꼭질 - python
코딩 코딩 코오딩
2022. 6. 17. 16:24
<문제>
https://www.acmicpc.net/problem/1697
1697번: 숨바꼭질
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
<시간 복잡도>
시간 복잡도는 어 음... 잘 모르겠다. 아는 건 우선 deque 라이브러리는 탐색을 수행할때 O(N)을 잡아먹는 빠른 라이브러리하는건 안다.
<코드>
from collections import deque
n,k = map(int,input().split())
visited = [False] * 100001
dx = [-1, 1 , 2]
def bfs(n,k):
end = k
q = deque()
q.append([n,0])
visited[n] = True
while q:
x, t = q.popleft()
if x == end:
return t
for i in range(3):
if dx[i] == 2:
nx = dx[i]*x
else:
nx = x + dx[i]
if 0 <= nx <=100000 and not visited[nx] :
visited[nx] = True
q.append([nx,t+1])
print(bfs(n,k))
<해설>
이 문제에서 핵심은 시간을 세는 방법이다.
이외의 풀이에서 BFS의 기본이니 꼭 알아두자 방문에 VISITED 체크와 움직이는 방향 결정 dx 와 같은 방법을 사용하면된다.
앞에 말한 이 문제의 핵심은 시간을 세는 방법인데 처음에는 그냥 count라 하고 for i in range(3) 이 끝나고 밖에 나올때
count +=1 의 방식으로 접근했지만 이렇게 접근을 하게 될때 시간에 대한 count 의 문제가 발생한다.
따라서 nx 가 방문 가능한 지역일 때 같이 t 라는 시간을 배열에 deque 에 넣어주게 되면서 문제를 해결 할 수 있었다.
끝
반응형