[BOJ] 1697 숨바꼭질

BFS


해당 문제는 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후 인지 구하는 내용이다. 즉, 문제를 다시 보면 최소값을 구하는 문제이다.

해당 문제는 최소값을 구하는 문제인데, 그리디 알고리즘을 사용하여 구하려고 보니, *2연산과 +1연산, -1연산등 모두 겹쳐서 수행할 수 있는 연산들이었기 때문에 정당성을 확보할 수 없었다. 따라서 가까운 것 부터 탐색을 해보기 위해 BFS를 떠올렸다.

최소값을 구하기 위해서 3가지 가능한 이동을 queue에 넣으며 진행했다. level-order로 진행하기 때문에 먼저 방문한 노드는, 더 가까운 방법으로 도달할 수 있었다는 것이므로 제외시키며 진행했다.

코드는 아래와 같다.

import sys
from collections import deque

def bfs(start, target, visited):
    queue = deque()
    queue.append(start)
    visited[start] = 0
    while queue:
        cur = queue.popleft()
        # 현재 노드가 타겟 노드이면
        if cur == target:
            break
        # 이미 방문한 노드가 아니면 추가
        if cur - 1 >= 0:
            if visited[cur - 1] == -1:
                queue.append(cur-1)
                visited[cur-1] = visited[cur] + 1
        if cur + 1 < 100001:
            if visited[cur + 1] == -1:
                queue.append(cur + 1)
                visited[cur + 1] = visited[cur] + 1
        if cur * 2 < 100001:
            if visited[cur * 2] == -1:
                queue.append(cur*2)
                visited[cur*2] = visited[cur] + 1
    return visited[target]

def solution(n, k):
    visited = [-1] * 100001
    return bfs(n, k, visited)

if __name__ == "__main__":
    N, K = map(int, sys.stdin.readline().rstrip().split())
    print(solution(N, K))

태그:

카테고리:

업데이트: