[BOJ] 1446 지름길

DP


이 문제는 0부터 시작해서 D 까지의 최단 경로를 구하는 문제이다. 지름길이 없을 경우 최단 경로는 그대로 D가 된다. N개의 지름길이 주어지고 이는 0~D사이의 임의의 두 점과 지름길의 길이가 주어진다.

역주행은 불가능 하다.

그래서 우선 내가 생각한 방법은 0~D까지의 1차원 배열을 선언 후 DP를 사용하는 것이다. 배낭문제와 유사하게 도착위치에서 지름길이 있다면 해당 지름길을 경유 하는 경우 vs 그냥 고속도로를 달리는 경우 의 최소값을 계속 업데이트 하는 방식으로 구현하면 된다.

구현


import sys

def dp(d):
    shortcuts.sort(key=lambda x: x[1])
    dist = [INF] * (d+1)
    dist[0] = 0
    idx = 0
    for i in range(1, d+1):
        while idx < len(shortcuts) and shortcuts[idx][1] == i:
            dist[i] = min(dist[i], i, dist[shortcuts[idx][0]] + shortcuts[idx][2])
            idx += 1
        dist[i] = min(dist[i], dist[i-1] + 1, i)
    return dist[-1]

if __name__ == "__main__":
    N, D = map(int, sys.stdin.readline().rstrip().split())
    shortcuts = []
    INF = int(1e9)
    for _ in range(N):
        shortcuts.append(list(map(int, sys.stdin.readline().split())))
    print(dp(D))