[BaekJoon 4485 : 다익스트라, Python] - 녹색 옷 입은 애가 젤다지?
2021, Nov 05
백준 1446 녹색 옷 입은 애가 젤다지? : 골드 4
Solution
BFS + DIKJSTRA + 맵 구현
import sys
input = sys.stdin.readline
from heapq import *
def solve(n, cost_map):
dirs = [(-1, 0), (0, -1), (0, 1), (1, 0)] # 모든 좌표는 (r, c)
min_cost = [[float('inf') for _ in range(n)] for _ in range(n)] # (k, l) 까지 이동하는 데 걸린 최소 cost
hq = []
heappush(hq, [cost_map[0][0], (0, 0)] )
while hq:
c_cost, (c_r, c_c) = heappop(hq)
for d in dirs:
n_r, n_c = c_r + d[0], c_c + d[1]
if 0 <= n_r < n and 0 <= n_c < n and min_cost[n_r][n_c] > c_cost:
n_cost = c_cost + cost_map[n_r][n_c]
if min_cost[n_r][n_c] > n_cost:
min_cost[n_r][n_c] = n_cost
heappush(hq, [n_cost, (n_r, n_c)])
return min_cost[-1][-1]
caves = []
while True:
try:
n = int(input())
if n == 0: break
caves.append([list(map(int, input().split())) for _ in range(n)])
print("Problem {}: {}".format(len(caves), solve(n, caves[-1])))
except:
break
풀이과정 및 느낀점
이번 문제는 BFS + 다익스트라 + 그래프 구현 이 세 가지 알고리즘이 적절히 섞인 문제였다.
다익스트라 알고리즘에서 존재하는 노드 간의 연결성 및 간선 가중치 값 정보를 이 문제에서는 동굴에서 가능한 이동방향과 (dirs) 각 좌표에서의 루피(cost) 가 대체해준다.
때문에 heapq 를 통해 연결된 좌표들 중에서 최소 비용을 가진 좌표만을 계속 반환해주면서, 그 좌표를 방문해서 해당 좌표까지 이동하는 데 걸리는 현재까지의 최소 cost 를 min_cost 값으로 갱신해주면 된다.
그리고 이 문제의 또 다른 포인트는 input 을 받는 코드인데, 보통의 경우 입력은 하나의 케이스만이 주어지거나, 혹은 정확히 몇 개의 test case 를 수행할 건지 개수 자체가 명시가 되어 그 만큼만 for 문을 돌려 입력을 받으면 된다.
하지만 이 문제 같은 경우 테스트 케이스의 개수가 고정되어 있지 않아서 while True + try-except 로 일단 계속 input 을 받고, 더이상 input 이 입력되지 않아 오류가 뜨면 그 때 while 문을 탈출하도록 해줬다.
좀 급하게 풀긴 했지만 나름 신선한 문제였다.