-
[2021 카카오 블라인드] 합승 택시 요금 (파이썬)코딩 테스트/프로그래머스 2023. 4. 17. 18:59
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/72413
문제 풀이
- S에서 출발해서 a,b에 도착하는 최소한의 비용을 출력하는 문제
- s->k->a , s->k->b 를 구해야함. 한 점을 지나쳐서 다른 점을 방문하는 것이므로 플로이드 와샬을 떠올릴 수 있음
- n의 갯수도 200 이하 이므로 시간 복잡도 괜찮
- 하지만 나는 다익스트라 최단 경로를 이용해서 특정 점에서 a와 b에 도착하는 최단 경로를 구해줌(시간을 더 최적화 시켜줄려고)
- dikstra라는 함수를 통해 각각의 점들에서 다른 점들 방문하는 최단 비용 구해주고
- start -> k, k -> a, k->b 이 경로 비용의 최소 값을 출력하면 됨.
소스 코드
import heapq INF = int(1e9) def solution(n, s, a, b, fares): answer = INF gr = [[]for i in range(n+1)] for i in fares: st,et,c = i gr[st].append([et,c]) gr[et].append([st,c]) distance = [[INF]*(n+1) for i in range(n+1)] def dikstra(start): q = [] heapq.heappush(q,(0,start)) distance[start][start]=0 while(q): c,cur = heapq.heappop(q) for nn in gr[cur]: next,cc = nn if distance[start][next]<=c+cc: continue else: distance[start][next]=c+cc heapq.heappush(q,(distance[start][next],next)) for i in range(1,n+1): dikstra(i) for i in range(1,n+1): answer=min(answer,distance[s][i]+distance[i][a]+distance[i][b]) return answer print(solution(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]])) # 예상되는 최저 택시요금은 다음과 같이 계산됩니다. # 4→1→5 : A, B가 합승하여 택시를 이용합니다. 예상 택시요금은 10 + 24 = 34원 입니다. # 5→6 : A가 혼자 택시를 이용합니다. 예상 택시요금은 2원 입니다. # 5→3→2 : B가 혼자 택시를 이용합니다. 예상 택시요금은 24 + 22 = 46원 입니다. # A, B 모두 귀가 완료까지 예상되는 최저 택시요금은 34 + 2 + 46 = 82원 입니다.
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[투 포인터] 보석 쇼핑 (파이썬) (0) 2023.04.20 [파이썬] 기지국 설치 (0) 2023.04.17 [탐색] 여행 경로 (python) (1) 2023.04.16 [그리드] 섬 연결하기 (python) (1) 2023.04.11 [그래프] 가장 먼 노드 (0) 2023.04.10