Algorithm/Baekjoon

[백준]1697번 숨바꼭질 파이썬 python

rrojin 2022. 1. 13. 16:16

문제 링크

https://www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys
from collections import deque
input = sys.stdin.readline
 
n, k = map(int,input().split())
MAX = 200000
check = [-1]*(MAX+1)
dq = deque()
check[n]=0
dq.append(n)
 
while dq:
    x = dq.popleft()
    if x==k:
        break
    for nx in [x+1, x-12*x]:
        if 0<=nx<=MAX and check[nx]==-1:
            check[nx]=check[x]+1
            dq.append(nx)
ans = check[k]
print(ans)
 
cs

핵심Point

- 가중치가 1인 최단길이를 구할 때 BFS를 사용한다. (가중치 존재 시, 다익스트라 알고리즘 사용)

- MAX값을 고려해야하는데, 가능한 연산이 x+1, x-1, 2*x이므로 최대를 20,000으로 잡을 수 있다. (x<=10,000)

- BFS의 시간복잡도는 O(V정점갯수+E간선수)

이때, 최대 정점수가 10,000이고 최대 간선수는 30,000 (B/C. 각 정점에서 3가지 행동가능) --> 총 40,000내에 해결가능