import heapq def solution(n, s, a, b, fares): answer = float('inf') total_node = set(range(1,n+1)) graph = [{} for i in range(n+1)] for start,end,fee in fares: graph[start][end] = fee graph[end][start] = fee def distra(start,end): nonlocal graph,n node_list = [] heapq.heappush(node_list,(0,start)) INF = float('inf') Fee_list = [INF]*(n+1) Fee_list[start] = 0 while node_list: fee,node = heapq.heappop(node_list) if fee > Fee_list[node]: continue if node == end: return fee for next_node in graph[node]: temp_fee = fee + graph[node][next_node] if Fee_list[next_node]> temp_fee: Fee_list[next_node] = temp_fee heapq.heappush(node_list,(temp_fee,next_node)) return INF for k in total_node: answer = min(answer,distra(s,k)+distra(k,a)+distra(k,b)) return answer solution(7,3,4,1,[[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]])
처음엔 다익스트라로 만들어서 풀었다. 이 풀이의 문제점은 한번했던 다익스트라를 계속하기 때문에, 시간이 오래걸리는 문제가 있었다.
import heapq def solution(n, s, a, b, fares): answer = float('inf') INF = float('inf') graph = [[INF if x!=y else 0 for x in range(n+1)] for y in range(n+1)] for start,end,fee in fares: graph[start][end] = fee graph[end][start] = fee for mid in range(1,n+1): for start in range(1,n+1): for end in range(1,n+1): if graph[start][end] > graph[start][mid] + graph[mid][end]: graph[start][end] = graph[start][mid] + graph[mid][end] for k in range(1,n+1): answer = min(answer,graph[s][k]+graph[k][a]+graph[k][b]) return answer
위의 문제가 매번 다읷트라를 계산하는것을 벗어나기 위해 플로이드 와샬로 각 노드에서 다른노드까지의 최저비용을 갱신해놓고, 그 합의 최저값을 구하는 방식으로 했다.
import heapq def solution(n, s, a, b, fares): answer = float('inf') INF = float('inf') graph = [{} for i in range(n+1)] for start,end,fee in fares: graph[start][end] = fee graph[end][start] = fee Fee_list = [[INF]*(n+1) for _ in range(3)] def distra(start,idx): nonlocal graph,n,Fee_list node_list = [] heapq.heappush(node_list,(0,start)) Fee_list[idx][start] = 0 while node_list: fee,node = heapq.heappop(node_list) if fee > Fee_list[idx][node]: continue for next_node in graph[node]: temp_fee = fee + graph[node][next_node] if Fee_list[idx][next_node]> temp_fee: Fee_list[idx][next_node] = temp_fee heapq.heappush(node_list,(temp_fee,next_node)) distra(s,0) distra(a,1) distra(b,2) for mid in range(1,n+1): temp = Fee_list[0][mid] + Fee_list[1][mid] + Fee_list[2][mid] if answer > temp: answer = temp return answer solution(7,3,4,1,[[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]])
마지막은 www.youtube.com/watch?v=FX9n1PFv2K4 유튜브의 barkingdog님의 풀이를 참조해서 푼 방식이다.
제일 첫번째의 매번 다익스트라를 하던것을 총 3번의 다익스트라로 그 값들을 전부 저장해놓고 푸는 방식이다.
자세한 설명은 유튜브를 참조하길 바란다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 72412번 문제 2021 KAKAO BLIND RECRUITMENT 순위 검색 (0) | 2021.03.04 |
---|---|
[프로그래머스] 72414번 문제 2021 KAKAO BLIND RECRUITMENT 광고 삽입 (0) | 2021.03.03 |
[프로그래머스] 72411번 문제 2021 KAKAO BLIND RECRUITMENT 메뉴 리뉴얼 (0) | 2021.03.02 |
[프로그래머스] 72410번 문제 2021 KAKAO BLIND RECRUITMENT 신규 아이디 추천 (0) | 2021.03.02 |
[프로그래머스] 72416번 문제 2021 KAKAO BLIND RECRUITMENT 매출 하락 최소화 (0) | 2021.02.15 |