문제링크
https://www.acmicpc.net/problem/13913
13913번: 숨바꼭질 4
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
https://rrojin.tistory.com/16 -> 1697번에서 추적 경로 탐색가 추가된 문제
[백준]1697번 숨바꼭질 파이썬 python
문제 링크 https://www.acmicpc.net/problem/1697 1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는..
rrojin.tistory.com
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
import sys
from collections import deque
#sys.setrecursionlimit(10**6)#재귀 최대 깊이 설정
input = sys.stdin.readline
MAX = 100001
n, k = map(int,input().split())
dq = deque()
dist = [-1]*MAX
route = [-1]*MAX
def track(o,d):
routes = []
dest = k
routes.append(k)
while dest != o:
routes.append(route[dest])
dest = route[dest]
routes.reverse()
print(' '.join(map(str, routes)))
'''
#역추적 방법2) 재귀
def track(o,d):
if o!=d:
track(o,route[d])
print(d,end=' ')
else:
print(o,end=' ')
'''
dist[n]=0#초기 위치(수빈's)
route[n]=n
dq.append(n)
while dq:
x = dq.popleft()
if x == k: #도착
print(dist[k])
track(n,k)
break
for nx in [x+1,x-1,2*x]: #가능한 3가지 행동
if 0<=nx<MAX and dist[nx]==-1:
dist[nx]=dist[x]+1
route[nx] = x #이전 정점이 무엇이었는지 기록
dq.append(nx)
|
cs |

핵심Point
- 가중치가 1인 최단경로 구하는 문제이기에 BFS알고리즘 적용한다.
- 경로를 구하기 위해서 이전에 방문한 정점을 저장한다. (코드에서, route리스트에 해당)
- if 0<=nx<MAX and dist[nx]==-1:
두 조건식의 순서가 바뀌면 런타임 에러 (IndexError) 가 발생하니 먼저 범위를 확인해야한다.
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준]13549 숨바꼭질3 파이썬 python (0) | 2022.01.14 |
---|---|
[백준]14226번 이모티콘 파이썬 python (0) | 2022.01.14 |
다익스트라 알고리즘 (0) | 2022.01.13 |
[백준]1697번 숨바꼭질 파이썬 python (0) | 2022.01.13 |
[백준]7562번 나이트의 이동 파이썬 python (0) | 2022.01.13 |