Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 그리디
- BFS
- 그래프 이론
- 수학
- 에라토스테네스의 체
- DFS
- 다시
- 투포인터
- 다이나믹프로그래밍
- 분할정복
- join
- 백트래킹
- 트리
- DP
- 누적합
- 자료구조
- 구현
- 재귀
- 다이나믹 프로그래밍
- 브루트포스
- 우선순위큐
- 그래프 탐색
- 플로이드-워셜
- 다익스트라
- 시뮬레이션
- 크루스칼
- 서브쿼리
- 해시
- GROUP BY
- MST
Archives
- Today
- Total
기록하고 까먹지 말기
합승 택시 요금 본문
날짜 : 2023. 10. 09
사용 언어 : python
문제
코드
다익스트라
import heapq
INF = int(1e9)
def solution(n, s, a, b, fares):
graph = [[] for _ in range(n + 1)]
for edge in fares: # 각 노드와 연결된 edge 체크
p, q, cost = edge
graph[p].append([q, cost])
graph[q].append([p, cost])
def dijkstra(start, end):
dist = [INF] * (n + 1)
dist[start] = 0 # 현재노드
queue = list()
heapq.heappush(queue, [0, start])
while queue:
d, now = heapq.heappop(queue) # 저장된 노드 체크
if dist[now] < d: # 기존 start ~ now 거리와 비교
continue
for edge in graph[now]: # now와 연결된 edge 체크
cost = d + edge[1]
if cost < dist[edge[0]]:
dist[edge[0]] = cost
heapq.heappush(queue, [cost, edge[0]]) # 다음에 이동할 노드, 그 노드까지의 거리 저장
return dist[end] # start에서 도착지까지의 최소값
res = dijkstra(s, a) + dijkstra(s, b)
for via in range(1, n + 1):
if via == s: continue
res = min(res, dijkstra(s, via) + dijkstra(via, a) + dijkstra(via, b))
return res
플로이드-워셜(n의 최대 크기가 200이기 때문에 사용 가능)
def solution(n, s, a, b, fares):
INF = int(1e9)
graph = [[INF] * (n + 1) for _ in range(n + 1)]
for edge in fares:
n1, n2, cost = edge
graph[n1][n2] = cost
graph[n2][n1] = cost
for i in range(n + 1): graph[i][i] = 0 # 자기 자신을 향한 거리는 무조건 0
for via in range(1, n + 1):
for start in range(1, n + 1):
for end in range(1, n + 1):
graph[start][end] = min(graph[start][end], graph[start][via] + graph[via][end])
res = graph[s][a] + graph[s][b] # 합승하지 않은 루트
for via in range(1, n + 1):
res = min(res, graph[s][via] + graph[via][a] + graph[via][b]) # 합승하여 이동
return res
풀이
- start -> end 까지의 최단거리를 구하는 다익스트라 함수를 구현한 다음, 합승하지 않은 경우의 수인 res를 설정한다.
- 이후 노드 1부터 n까지 체크하면서 합승한 케이스를 다익스트라를 사용해 최소값을 갱신한 후 값을 리턴한다.
알게된 점
- 다익스트라를 구현해 곧바로 풀 수 있었던 문제였다.
- 주어진 루트를 2차원 그래프로 변환하는 것과 경로를 찾는 알고리즘을 사용해 활용하는 아이디어를 떠올리는 것이 골자였다.
- 플로이드-워셜의 구현이 확실히 쉬웠고 해당 문제는 노드의 최대 개수가 200개밖에 되지 않아 O(n^3)도 가능했었다.
- 다만 마지막에 본인이 본인 노드를 가는 케이스를 0으로 초기화하지 않는 바람에 테스트케이스3에서 계속 오류가 발생했었다.
- 여러모로 다익스트라와 플로이드-워셜 구현 연습을 할 필요성을 느끼게 해 주는 문제였다.
참고 사이트
-
'전공 > 프로그래머스' 카테고리의 다른 글
과제 진행하기 (0) | 2023.10.12 |
---|---|
이중 우선순위 큐 (0) | 2023.10.10 |
양과 늑대 (0) | 2023.10.08 |
(SQL) 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (0) | 2023.10.07 |
(SQL) 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2023.10.06 |