개발/algorithm
[프로그래머스][level3] 합승 택시 요금 -python
zzi_on2
2022. 1. 10. 15:01
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/72413
코딩테스트 연습 - 합승 택시 요금
6 4 6 2 [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] 82 7 3 4 1 [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] 14 6 4 5 6 [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4
programmers.co.kr
풀이
- 다익스트라 알고리즘 사용
- 다익스트라 알고리즘 이란 ?
-
그래프에서 여러 개의 노드가 있을 때, 특정한 노드에서 출발하여 다른 노드로 가는 각각의 최단 경로를 구해주는 알고리즘
- 다익스트라 알고리즘에서 시작 노드와 끝노드를 설정해주어, 최단 경로를 구하도록 했는데 계속 틀린 답이 나왔다. 그 이유는 dijkstra 함수에 매개 변수로 넘긴 a와 b가 계속 다른 값으로 나타났다. 이 값은 for문에서 사용된 a,b의 마지막 값이었다... for문에 사용된 변수 이름을 a,b가 아닌 다른 이름으로 수정하니 바로 해결되었다... 이걸로 시간 많이 쏟음. 앞으로 변수명이 겹치지 않도록 주의 ..
# 틀린 코드
INF = int(1e9)
import heapq
def solution(n, s, a, b, fares):
graph = [ [] for _ in range(n+1) ]
for a, b, c in fares:
graph[a].append((b,c))
graph[b].append((a,c))
answer = INF
for t in range(1, n+1):
answer = min(answer, dijkstra(graph,n,s,t)+dijkstra(graph,n,t,b)+ dijkstra(graph,n,t,a))
return answer
def dijkstra(graph, n, start, end):
distance = [INF] * (n+1)
q = []
heapq.heappush(q, (0,start))
distance[start] = 0
while q :
# 가장 최단거리가 짧은 노드에 대한 정보 꺼내기
dist, now = heapq.heappop(q)
# 이미 처리된 적이 있으면 무시
if distance[now] < dist :
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost,i[0]))
return distance[end]
- 아래는 제출한 코드이다.
-
INF = int(1e9) import heapq def solution(n, s, a, b, fares): graph = [ [] for _ in range(n+1) ] # 거리 저장 for e1, e2, c in fares: graph[e1].append((e2,c)) graph[e2].append((e1,c)) answer = INF for t in range(1, n+1): # 최단 비용 거리 answer = min(answer, dijkstra(graph,n,s,t)+dijkstra(graph,n,t,b)+ dijkstra(graph,n,t,a)) print(answer) return answer # 다익스트라 알고리즘 def dijkstra(graph, n, start, end): distance = [INF] * (n+1) q = [] heapq.heappush(q, (0,start)) distance[start] = 0 while q : # 가장 최단거리가 짧은 노드에 대한 정보 꺼내기 dist, now = heapq.heappop(q) # 이미 처리된 적이 있으면 무시 if distance[now] < dist : continue for i in graph[now]: cost = dist + i[1] if cost < distance[i[0]]: distance[i[0]] = cost heapq.heappush(q, (cost,i[0])) return distance[end]