https://www.acmicpc.net/problem/1697
1697번: 숨바꼭질
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
<문제>
<풀이>
입력으로 수빈이와 동생의 위치, 그리고 수빈이가 이동할 수 있는 제약조건을 알려준다.
수빈이의 위치보다 동생의 위치가 더 앞에 있거나 같을때는 (n >= k) 뒤로 가는 방법이 한칸 이동하는 것 밖에 없으므로 n - k 로 쉽게 결과를 도출 할 수 있다.
그 외의 경우에는 각각의 좌표를 노드라고 생각했을 때, 이 그래프는 각 노드가 노드값이 1만큼 크거나 작은 노드와 2배인 노드와 연결되어 있다.
따라서 BFS를 이용하면 쉽게 해결 할 수 있다.
<코드>
from collections import deque
def bfs(n, k):
bfsQ = deque()
bfsQ.append([n, 0])
while bfsQ:
node = bfsQ.popleft()
if node[0] == k:
return node[1]
teleport = node[0] * 2
front = node[0] + 1
back = node[0] - 1
moves = [teleport, front, back]
for i in range(3):
if moves[i] < 0 or moves[i] > 100_000:
continue
if not isVisited[moves[i]]:
isVisited[moves[i]] = True
bfsQ.append([moves[i], node[1] + 1])
n, k = map(int, input().split())
isVisited = [False] * 100_001
if n >= k:
print(n - k)
else:
print(bfs(n, k))
이 문제에서 isVisited를 쓴 이유는, 앞서 방문한 좌표라면 그 다음에 갈 수 있는 노드가 이미 큐에 들어있기 때문에 불필요한 계산을 하는 경우를 방지해준다.
'Problem Solving > Python' 카테고리의 다른 글
[백준]BOJ 3055 - 탈출 - Python/BFS (0) | 2022.11.17 |
---|---|
[백준]BOJ 7576 - 토마토 - Python/BFS (0) | 2022.11.10 |
[백준]BOJ 2331 - 반복 수열 - Python/구현 (0) | 2022.11.07 |
[백준]BOJ 2667 - 단지 번호 붙이기 - Python (0) | 2022.11.07 |
[백준]BOJ 10451 - 순열 사이클 - Python (1) | 2022.11.06 |
댓글