백준 1697

justhaza.log·2024년 3월 31일

알고리즘: BOJ

목록 보기
48/125

수빈이와 동생의 위치가 주어지고,
수빈이가 현재 위치 X에 대해 X - 1, X + 1, 2 * X로 이동 가능할 때,
수빈이가 동생의 위치로 가는 가장 빠른 시간을 구하는 문제이다.


처음에는 2 * X를 최대한 활용하고,
X - 1, X + 1로 세부 거리를 조정하는 방법을 떠올렸다.

그런데 수빈이의 초기 위치를 기준으로,
이동 가능한 3가지 경우를 고려했을 때,
트리 구조로 모든 경우를 그려볼 수 있었다.


DFS, BFS 중 BFS를 사용한 이유는 다음과 같다.

1) DFS는 모든 경로에 대해 깊은 곳까지 탐색하므로 최단 시간을 보장할 수 없다.
2) BFS는 시간 노드(위치)부터 탐색을 시작해서 목표 노드에 도달하는 순간이 최단 시간이라 할 수 있다.


그리고 불필요한 탐색을 줄이기 위해 visited 리스트를 활용하여,
이미 방문한 노드(위치)라면 추가로 탐색하지 않았다.

또한, 이동해야 하는 위치(next_pos)가 범위를 벗어나는 경우도 탐색하지 않았다.


위의 과정을 반복하며,
현재 위치가 동생의 위치와 같다면 visited[pos] - 1을 반환했다.


코드(정답)는 다음과 같다.

# 1697

import sys
from collections import deque


def bfs(n, k):
    q = deque()
    visited = [0] * 100001

    q.append(n)
    visited[n] = 1
    while q:
        pos = q.popleft()

        if pos == k:
            return visited[pos] - 1

        for next_pos in [pos - 1, pos + 1, pos * 2]:
            if 0 <= next_pos <= 100000 and visited[next_pos] == 0:
                q.append(next_pos)
                visited[next_pos] = visited[pos] + 1
    
    # 예외 처리
    return -1


n, k = map(int, sys.stdin.readline().split())

ans = bfs(n, k)
print(ans)

참고

https://www.youtube.com/watch?v=O8K5A9ojrVw

profile
알고리즘이나 SQL 문제 풀이를 올리고 있습니다. 피드백 환영합니다!

0개의 댓글