알고리즘 풀이/SWEA

[다익스트라] 1249 보급로

mhko411 2021. 4. 25. 18:24
728x90

NxN의 맵이 있다. (0, 0)에서 출발해서 (N-1, N-1)까지 이동을 하려고하는데 중간중간에 도로들이 파손이 되어있다. 파손된 도로를 복구하는데 걸리는 시간은 각 칸에 적힌 수만큼 걸린다. 도로를 이동할 때 걸리는 시간을 제외하고 출발지부터 도착지까지 복구하면서 이동할 때 걸리는 시간이 최소인 시간을 구하라.


접근

- 기본적으로 다익스트라를 적용시켰다.

- 2차원 맵이기 때문에 현재위치에서 상하좌우 칸에 대한 시간을 구하여 최솟값을 갱신해나간다.

 

구현

- 2차원 맵에 대한 정보를 입력받아 graph라는 2차원 리스트에 저장한다.

- 이후 solve함수에서 해를 구하여 반환한다.

- 다음은 solve함수에 대한 코드이다.

- 먼저 각 칸을 INF로 초기화하여 나중에 최솟값으로 갱신될 수 있도록 한다.

- 우선순위 큐를 활용하여 다른 칸을 탐색하고 (소요시간, Y, X) 순으로 저장한다.

    INF = 987654321
    dist = [[INF for _ in range(N)] for _ in range(N)]

    hq = []
    heapq.heappush(hq, (0, 0, 0))
    dist[0][0] = 0

 

- BFS 탐색을 한다.

- 현재 위치의 최솟값이 현재 꺼낸 값보다 작으면 더 이상 탐색하지않고 다음 위치를 탐색한다.

    while hq:
        cur_weight, cy, cx = heapq.heappop(hq)
        if dist[cy][cx] < cur_weight:
            continue

 

- 현재위치를 기준으로 상하좌우를 탐색한다.

- 다음 위치가 맵 범위 내에 있을 때 현재까지의 시간과 다음 칸의 시간을 더해서 weight에 저장한다.

- 다음위치에 저장되어있는 최솟값과 weight와 비교하여 weight가 더 작다면 최솟값을 갱신한다.

- 그리고 다음에 탐색할 수 있도록 힙에 저장한다.

        for d in range(4):
            ny = cy + dy[d]
            nx = cx + dx[d]
            if check_range(ny, nx):
                weight = graph[ny][nx] + cur_weight
                if dist[ny][nx] > weight:
                    dist[ny][nx] = weight
                    heapq.heappush(hq, (weight, ny, nx))

 

- 위에서 BFS 탐색이 종료되었을 때 (N-1, N-1)에 최종적인 해가 저장되어있을 것이고 이를 반환한다.

    return dist[N-1][N-1]

전체 코드

import sys
import heapq
sys.stdin = open("input.txt")

test_case = int(input())

def check_range(y, x):
    return (0 <= y < N) and (0 <= x < N)

def solve():
    INF = 987654321
    dist = [[INF for _ in range(N)] for _ in range(N)]

    hq = []
    heapq.heappush(hq, (0, 0, 0))
    dist[0][0] = 0

    dy = [1, -1, 0, 0]
    dx = [0, 0, 1, -1]
    while hq:
        cur_weight, cy, cx = heapq.heappop(hq)
        if dist[cy][cx] < cur_weight:
            continue

        for d in range(4):
            ny = cy + dy[d]
            nx = cx + dx[d]
            if check_range(ny, nx):
                weight = graph[ny][nx] + cur_weight
                if dist[ny][nx] > weight:
                    dist[ny][nx] = weight
                    heapq.heappush(hq, (weight, ny, nx))

    return dist[N-1][N-1]

for tc in range(test_case):
    N = int(input())
    graph = [list(map(int, input())) for _ in range(N)]

    answer = solve()
    print("#{} {}".format(tc+1, answer))

'알고리즘 풀이 > SWEA' 카테고리의 다른 글

[SWEA 5653] 줄기세포배양  (0) 2021.07.28
[SWEA 2115] 벌꿀 채취  (0) 2021.07.27
[SWEA 2117] 홈 방범 서비스  (0) 2021.07.20
[다익스트라] 5251 최소 이동 거리  (0) 2021.04.25
[프림] 5249 최소 신장 트리  (0) 2021.04.25