이번 문제는 다익스트라 알고리즘으로 풀 수 있는 문제이다. 우선 그래프를 인접 행렬 형태로 저장하고, 4가지 방향에 대한 탐색을 통하여 그때 그때의 최솟값으로 갱신하는 방식으로 최단거리를 구하였다. 우선 해당 좌표가 -1일 경우에는 접근할 수 없으므로 다음으로 탐색할 수 있는 조건으로 좌표의 값이 -1이 아니고 0<=y<m, 0<=x<m의 범위 안에 있을 경우를 넣어주었다.
graph[0][0]
이 -1일 경우, -1을 출력하고 프로그램을 종료시킨다.sys.maxsize
를 저장한다.dist[0][0]
을 graph[0][0]
으로 갱신한다.(graph[0][0], 0, 0)
을 넣는다.dist[y][x]
보다 클 경우, 다음 반복으로 넘어간다.y+dy[i]
로 저장한다.x+dx[i]
로 저장한다.graph[ny][nx]
가 -1이 아닐 경우,cost+graph[ny][nx]
로 저장한다.dist[ny][nx]
보다 작을 경우,dist[ny][nx]
를 nxt_cost로 갱신한다.(nxt_cost, ny, nx)
를 넣는다.dist[m-1][n-1]
이 INF와 같을 경우, -1을 출력한다.dist[m-1][n-1]
을 출력한다.import sys
import heapq
m, n=map(int, input().split())
graph=[]
for _ in range(m):
graph.append(list(map(int, input().split())))
if graph[0][0]==-1:
print(-1)
quit()
dy=[0, 0, -1, 1]
dx=[-1, 1, 0, 0]
INF=sys.maxsize
dist=[[INF]*n for _ in range(m)]
dist[0][0]=graph[0][0]
q=[]
heapq.heappush(q, (graph[0][0], 0, 0))
while q:
cost, y, x=heapq.heappop(q)
if cost>dist[y][x]:
continue
for i in range(4):
ny=y+dy[i]
nx=x+dx[i]
if 0<=ny<m and 0<=nx<n and graph[ny][nx]!=-1:
nxt_cost=cost+graph[ny][nx]
if nxt_cost<dist[ny][nx]:
dist[ny][nx]=nxt_cost
heapq.heappush(q, (nxt_cost, ny, nx))
if dist[m-1][n-1]==INF:
print(-1)
else:
print(dist[m-1][n-1])