Odds and Ends
백준 : 1446번 지름길 [다익스트라 알고리즘, 실버 1] 본문
문제
매일 아침, 세준이는 학교에 가기 위해서 차를 타고 D킬로미터 길이의 고속도로를 지난다. 이 고속도로는 심각하게 커브가 많아서 정말 운전하기도 힘들다. 어느 날, 세준이는 이 고속도로에 지름길이 존재한다는 것을 알게 되었다. 모든 지름길은 일방통행이고, 고속도로를 역주행할 수는 없다.
세준이가 운전해야 하는 거리의 최솟값을 출력하시오.
입력
첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이가 주어진다. 모든 위치와 길이는 10,000보다 작거나 같은 음이 아닌 정수이다. 지름길의 시작 위치는 도착 위치보다 작다.
출력
세준이가 운전해야하는 거리의 최솟값을 출력하시오.
예제 입력
5 150
0 50 10
0 50 20
50 100 10
100 151 10
110 140 90
예제 출력
70
[문제 풀이]
- 최단거리 문제로 다익스트라 알고리즘을 적용한다.
- 그래프 구조에서 다익스트라를 사용함으로 노드와 간선을 지정한다.
- 시작노드를 0, 도착노드를 d로 설정한다. (1,2,3,..,D-1,D를 노드로 간주, heapq 를 활용한 다익스트라 알고리즘은 O(E logV)이고 D는 최대 10,000 이기때문에 가능함)
import sys
import heapq
N, D = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(D+1)]
for i in range(D):
graph[i].append((i+1, 1))
for i in range(N):
start, end, length = map(int, sys.stdin.readline().split())
if end > D: continue
graph[start].append((end, length))
INF = 987654321
distance = [INF]*(D+1)
distance[0] = 0
q = []
heapq.heappush(q, (0, 0))
while q:
d, now = heapq.heappop(q)
if distance[now] < d: continue
for x in graph[now]:
cost = d + x[1]
if distance[x[0]] > cost:
distance[x[0]] = cost
heapq.heappush(q, (cost, x[0]))
print(distance[D])
+ 문제가 안풀려서 참고한 글
https://velog.io/@heyksw/Python-%EB%B0%B1%EC%A4%80-silver-1446-%EC%A7%80%EB%A6%84%EA%B8%B8
이렇게도 풀 수 있는 듯, 공부 필요
N, D = map(int, input().split())
li = [list(map(int, input().split())) for _ in range(N)]
dis = [i for i in range(D+1)]
for i in range(D+1):
if i > 0:
dis[i] = min(dis[i], dis[i-1]+1)
for s, e, d in li:
if i == s and e <= D and dis[i]+d < dis[e]:
dis[e] = dis[i]+d
print(dis[D])
728x90
'코딩 테스트' 카테고리의 다른 글
백준 : 3135번 라디오 [실버5, 그리디] (0) | 2022.07.04 |
---|---|
백준 : 1753 최단경로 [파이썬, 다익스트라 알고리즘, 골드 4] (0) | 2022.07.02 |
백준 : 1920번 수 찾기 (0) | 2022.06.29 |
백준 : 17266번 어두운 굴다리, 이분탐색 (0) | 2022.06.29 |
백준 : 11866 요세푸스 문제 0 [구현, 실버5] (0) | 2022.06.24 |