본문 바로가기
DEVLOG/Algorithms

[BOJ 1697] 숨바꼭질 파이썬(Python) 풀이

2019. 9. 4.
반응형

문제보기

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

 

1697번: 숨바꼭질

문제 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다. 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지

www.acmicpc.net

문제 해설

완전 탐색 방법에는 다음과 같은 방법들이 있습니다.

  • Brute Force : for문과 if문을 이용해 처음부터 끝까지 탐색하는 방법
  • 비트마스크
  • 순열 : 순열의 시간 복잡도는 O(N)
  • 백트래킹
  • BFS

이 문제는 BFS로 풀 수 있습니다.

역시나 처음에는 노가다를 좀.. 해봤습니다

수빈이의 위치는 -1, +1, X2로 이동할 수 있습니다. 위 예시에서 볼 수 있듯이 DFS로 풀 경우, 무한 루프에 빠지게 발생하게 됩니다.

 

정답 코드

from collections import deque


def bfs():
    q = deque()
    q.append(N)
    while q:
        v = q.popleft()
        if v == K:
            print(time[v])
            return
        for next_step in (v-1, v+1, v*2):
            if 0 <= next_step < MAX and not time[next_step]:
                time[next_step] = time[v] + 1
                q.append(next_step)


MAX = 100001
N, K = map(int, input().split())
time = [0]*MAX
bfs()

리스트(List)를 큐로 사용하면 절대 안됩니다. 큐는 반드시 collections.deque를 써야 합니다.

queue.Queue는 멀티스레딩을 위해 만들어진 큐이고 매우 느립니다.

 

 

반응형

댓글