백준
[백준-Python] 숨바꼭질 : 1697번
Yuuuki
2024. 6. 11. 20:31
🥈 Silver1
https://www.acmicpc.net/problem/1697
메모리 | 실행시간 |
40316KB | 252ms |
✅ 정답풀이
import sys
from collections import deque
input = sys.stdin.readline
# 최단경로 찾기=최단시간 찾기 (bfs)
def bfs(start,target):
global cur
queue=deque([start])
visited[start]=0 #시작점은 이동거리=0
while queue:
cur=queue.popleft()
if cur==target:
return visited[cur]
for i in range(3):
if i<2:
nx=cur+dx[i]
else:
nx=cur*dx[i]
if 0 <= nx <= max(n, m) * 2 and visited[nx] == -1:
visited[nx]=visited[cur]+1
queue.append(nx)
n, m = map(int, input().rstrip().split())
visited = [-1] * (max(n, m) * 2 + 1) #두배까지 이동할수 있기 때문
cur = n # 수빈 현재위치
dx = [1, -1, 2]
result=bfs(cur, m)
print(result)
수빈이는 1초동안 3가지의 경우로 이동할 수 있고, 동생의 위치까지 도달하는 가장 빠른 시간을 구하는 문제인데, 이는 최단거리 구하는 방식을 사용하면된다. 3가지 방향으로 순차적으로 탐색해 나갈것이기 때문에 BFS가 적절한 방법이고, visited 리스트에 이동해온 거리가 아닌 시간을 저장해둔다.
❗️이동시간을 저장하는 visited 리스트의 길이가 오답의 원인이였다.
max값의 좌표 위치에서 2배를 이동한다면, 이 값이 최대로 이동할 수 있는 x좌표이기 때문에 최소한 이값 까지 포함한 visited 리스트를 생성해줘야 한다. 다른 풀이를 참고해보니 주로 문제조건에서 주어진 N값의 범위를 사용하였다.