Search

BOJ 4485 녹색 옷 입은 애가 젤다지?

태그
그래프 이론
그래프 탐색
최단 경로
데이크스트라
생성일
2025/02/21 08:04

문제 설명

N×NN \times N 크기의 동굴 맵이 주어질 때, (0, 0)에서 (N - 1, N - 1)까지 이동하는 최단 경로를 구하는 문제

예제 입력/출력

입력1
3 5 5 4 3 9 1 3 2 7 5 3 7 2 0 1 2 8 0 9 1 1 2 1 8 1 9 8 9 2 0 3 6 5 1 5 7 9 0 5 1 1 5 3 4 1 2 1 6 5 3 0 7 6 1 6 8 5 1 1 7 8 3 2 3 9 4 0 7 6 4 1 5 8 3 2 4 8 3 7 4 8 4 8 3 4 0
Plain Text
복사
출력1
Problem 1: 20 Problem 2: 19 Problem 3: 36
Plain Text
복사

제약 조건

2N1252 ≤ N ≤ 125

문제 풀이

접근1 브루트포스 (완전 탐색) - O(4N2)O(4^{N^2})
접근2 그리디
접근3 BFS + DP - O(N2)O(N^2)
접근4 다익스트라 - O(N2×logN)O(N^2 \times logN)
이 문제는 가중치가 있는 최단 경로 문제이므로 다익스트라를 사용하여 해결할 수 있다.
모든 가중치가 양수(0~9)
다익스트라는 우선순위 큐(힙)를 사용하여 가장 비용이 적은 경로를 먼저 탐색하기 때문에 모든 간선을 동일하게 취급하는 BFS와 달리 빠르게 최소 경로를 탐색할 수 있다.
접근 방법
1.
각 칸을 하나의 노드로 간주하고 (x, y) 좌표를 기반으로 최소 비용을 갱신
2.
우선순위 큐(힙)를 사용하여 현재 최소 비용이 드는 경로부터 처리
3.
(N - 1, N - 1)에 도착할 때까지 최소 비용을 계속 갱신

풀이 코드

접근3 BFS + DP - O(N2)O(N^2)
접근4 다익스트라 - O(N2×logN)O(N^2 \times logN)
import heapq INF = int(1e9) dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] t = 0 while True: t += 1 N = int(input()) if N == 0: break adj_matrix = [[0] * (N + 1)] # 동굴 행렬 for _ in range(N): adj_matrix.append([0] + list(map(int, input().split()))) # 다익스트라 알고리즘 dist_matrix = [[INF] * (N + 1) for _ in range(N + 1)] # 최단 거리 행렬 dist_matrix[1][1] = adj_matrix[1][1] # 시작 노드 초기화 hq = [] # 힙 자료구조 heapq.heappush(hq, (adj_matrix[1][1], 1, 1)) # (비용, x, y) while hq: cur_dist, x, y = heapq.heappop(hq) for d in range(4): nx = dx[d] + x ny = dy[d] + y if (0 < nx <= N) and (0 < ny <= N): tmp_dist = cur_dist + adj_matrix[ny][nx] if tmp_dist < dist_matrix[ny][nx]: dist_matrix[ny][nx] = tmp_dist heapq.heappush(hq, (tmp_dist, nx, ny)) print(f"Problem {t}: {dist_matrix[N][N]}")
Python
복사

참고 자료