Baekjoon

Baekjoon 1697번 숨바꼭질

ppwag 2020. 8. 8. 22:35

문제

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

걸린 시간

02 : 57 : 24 실패

풀이

Python3

from collections import deque

if __name__ == "__main__":
    N, K = map(int, input().split())

    d = deque()        
    bound = 100000
    visited = [0]*(bound+1)
    t = 0

    visited[N] = 1
    d.append([N, 0])

    while d:
        X, t = d.popleft()

        if X == K:
            break

        t += 1

        if X-1 >= 0 and not visited[X-1]:
            visited[X-1] = 1
            d.append([X-1, t])

        if X+1 <= bound and not visited[X+1]:
            visited[X+1] = 1
            d.append([X+1, t])

        if X*2 <= bound and not visited[X*2]:
            visited[X*2] = 1
            d.append([X*2, t])

    print(t)

문제를 처음 읽었을 때 어떤 알고리즘을 사용해야 할지 전혀 감이 오질 않았다.

주어진 정보는 1차원 선 상에 놓인 수빈이와 동생의 위치 그리고 수빈이가 동생을 찾기 위해 이동할 수 있는 세가지 수단이 전부였기 때문이다.

글로만 봐선 특정 자료구조 형태를 띄고 있지 않지만 이 문제는 그래프 형태로 바꾸어 생각해 풀이해야한다. (어떻게?)

수빈이가 앞과 뒤로 걷거나 순간이동 하는 경우 모두 이동 비용이 1초로 동일하고, 동생을 찾을 수 있는 가장 빠른 시간을 구해야한다는 두가지 조건으로부터 그래프의 너비 우선 탐색(BFS)을 떠올릴 수 있다.

그림으로 과정을 그려가며 설명한 아래 링크의 풀이글이 이해하는데 많은 도움이 됐다.

참고

'Baekjoon' 카테고리의 다른 글

Baekjoon 1463번 1로 만들기  (0) 2020.08.09
Baekjoon 9095번 1, 2, 3 더하기  (0) 2020.08.09
Baekjoon 1931번 회의실배정  (0) 2020.08.07
Baekjoon 2606번 바이러스  (0) 2020.08.06
Baekjoon 1012번 유기농 배추  (0) 2020.08.06

댓글