308. 지름길
1) 어떤 전략(알고리즘)으로 해결?
2) 코딩 설명
<내 풀이>
from collections import defaultdict
import sys
import heapq
N,D = map(int,sys.stdin.readline().rstrip().split())
graph = defaultdict(list)
shortest = [int(1e9) for _ in range(10000)]
for i in range(10000) :
graph[i].append((1, i+1))
for i in range(N) :
start, end, cost = map(int,sys.stdin.readline().rstrip().split())
if cost > D :
continue
graph[start].append((cost, end))
hq = []
heapq.heappush(hq, (0,0))
while hq :
now_cost, now_node = heapq.heappop(hq)
if shortest[now_node] < now_cost :
continue
if(now_node in graph.keys()) :
for next_cost, next_node in graph[now_node] :
if next_node < 10000:
if shortest[next_node] > now_cost + next_cost :
shortest[next_node] = now_cost + next_cost
heapq.heappush(hq, (now_cost + next_cost, next_node))
print(shortest[D])
<내 틀렸던 풀이, 문제점>
1. 인덱스 에러 발생
- 문제 조건에서 노드가 10000개 미만이라 했기에, 10000노드에 대한 정보로 shortes와 graph 를 구성해주었다.
- 또한 연속적인 직선길이라서 default 로 처음에 graph 에
현재 노드가 i이라면 다음 노드로는 무조건 갈 수 있으니, 다음노드 = i+1 비용은 1로 초기화 입력을 시켜줍니다.
from collections import defaultdict
import sys
import heapq
N,D = map(int,sys.stdin.readline().rstrip().split())
graph = defaultdict(list)
shortest = [int(1e9) for _ in range(D+4)]
for i in range(D+1) :
graph[i].append((1, i+1))
for i in range(N) :
start, end, cost = map(int,sys.stdin.readline().rstrip().split())
if cost > D :
continue
graph[start].append((cost, end))
hq = []
heapq.heappush(hq, (0,0))
while hq :
now_cost, now_node = heapq.heappop(hq)
if shortest[now_node] < now_cost :
continue
if(now_node in graph.keys()) :
for next_cost, next_node in graph[now_node] :
if shortest[next_node] > now_cost + next_cost :
shortest[next_node] = now_cost + next_cost
heapq.heappush(hq, (now_cost + next_cost, next_node))
print(shortest[D])
<반성 점>
- 또한 연속적인 직선길이라서 default 로 처음에 graph 에
현재 노드가 i이라면 다음 노드로는 무조건 갈 수 있으니, 다음노드 = i+1 비용은 1로 초기화 입력을 시켜줍니다.
<배운 점>