알고리즘 문제풀이

백준 1697 파이썬 : 숨바꼭질

dolchimdae 2022. 4. 20. 18:50
반응형

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

 

1697번: 숨바꼭질

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

www.acmicpc.net

< 소스 코드 >

from collections import deque

def bfs(n,k):
  q = deque([n])
  while q:
    x = q.popleft()
    # 그냥 먼저 k에 도달하면 제일 작은 수.
    if x == k:
      print(dist[x])
      break
    ## for 문 작성법
    for nx in (x-1, x+1,x*2):
      ## nx 의 범위 체크, 이미 nx 에 도달한 경우 제외
      if 0 <= nx <= MAX and not dist[nx]:
        dist[nx] += dist[x] + 1
        q.append(nx)

n, k = map(int,input().split())
## 문제 지시사항의 최대 수를 체크할 것
MAX = 10 ** 5
##
dist = [0] * (MAX+1)
bfs(n,k)

문제 조건을 유의해 읽어야하거늘... MAX 를 4*k 로 했다가 틀렸다.

BFS 문제인데, 먼저 nx 에 도달하면 후에 nx 에 도달하는 경우를 아예 제외시킨다.

먼저 도달하면 당연히 그때껏 번째 수(?)도 최소가 된다.

원래 나는 for 문을 저렇게 쓸 생각을 못하고 각 경우 그대로 썼다가 코드가 라푼젤 머리길이만큼 길었으니..

파이썬은 for 문은 참 versatile 한 듯.

반응형