알고리즘/baekjoon

[알고리즘/baekjoon] 1697_숨바꼭질(python)

천뿌니 2021. 11. 25. 14:11
728x90

문제

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

 

1697번: 숨바꼭질

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

www.acmicpc.net

# 가장 짧은 or 가장 빠른하면 bfs를 생각하자 -> bfs는 deque를 사용한다.(그냥 que는 비효율적)
# x-1, x+1, x*2로 분기로 나눠지니깐 dfs로 풀 경우 무한루프에 빠질수있다.
# n,k의 값의 최대값이 100,000 인지한다
 
정답
from collections import deque # deque 선언

MAX = 100000
n, k = map(int, input().split())
visited = [0] * (MAX+1) # max크기만큼 거리를 저장하는 배열 선언

def bfs(n):
  q = deque()
  q.append(n)

  while q:
    x = q.popleft()
    if x == k: # k의 위치를 찾으면
      print(visited[x]) # 횟수를 출력
      break

    for i in (x-1, x+1, x*2): # x-1, x+1, x*2 분기로 입력을 준다.
      if 0<=i<=MAX and visited[i] == 0: # 문제에 맞게 0보다 크고 max보다 작은 경우일때와 방문하지 않았다면
        visited[i] = visited[x] + 1 # 1초 증가하여 저장
        q.append(i) # q에 추가

bfs(n)
# 5 17이 입력으로 들어왔을 경우
# 5 > 4/6/10(시간:1)) > 3/5/8, 5(방문)/7/12, 9/11/20(시간:2) -> 17일 나올때의 시간을 찾는다.
# 위에서 방문한 거리는 시간이 저장되어 있기 때문에 중복으로 방문하지 않는다.(if 조건문에 의해)