말이 어려우니, 예제 입력 3번을 기준으로 설명해보겠다.
N = 8, D = 900
(0, 10) : 9
(80, 190): 100
(50, 70): 15
(160, 180): 14
(140, 160): 14
(450, 900): 0
이 값들만 입력으로 받게 된다.
그리고, 출발점과 도착점으로 리스트를 만든다.
[0, 10, 50, 70, 80, 140, 160, 180, 190, 450, 900]
그리고, 새로 리스트를 하나 생성하여 지점까지의 최소 값을 담는다.
예를 들어, 70까지 가기 위해서 얼마만큼의 거리를 이동해야 하는가를 보자.
(0, 70) + 0, (10, 70) + 10에 해당하는 값, (50, 70) + 50에 해당하는 값, 70-50 + 50에 해당하는 값 이 값들을 비교하여 가장 작은 값을 새로운 리스트의 70에 해당하는 3번째 index에 값을 업데이트 한다.
(딕셔너리에 (0, 70), (10, 70), (50, 70) 값 중 존재하지 않는 것들은 계산하지 않는다. 70-50 + 50에 해당하는 값은 무조건 존재하기 때문에, 딕셔너리에 모두다 없다면, 50이 가지고 있는 값에서 70-50을 더해준 값이 업데이트 된다.)
이렇게 값을 끝까지 업데이트하면
[0, 9, 49, 64, 74, 134, 148, 162, 172, 432, 432]가 된다.
리스트의 마지막 값이 정답이 된다.
문제 이름부터 지름길이었고, 최단 거리를 찾는 문제여서 다익스트라나 BFS를 썼으면 쉽게 풀었을 것 같다. 그래프로 생각하지 못하여서 DP를 이용해서 풀었는데, 괜히 어렵게 생각 한 것 같다. 최단 거리를 찾는 문제에 익숙해질 필요를 느꼈다.