https://programmers.co.kr/learn/courses/30/lessons/42861
costs 리스트를 비용 기준으로 정렬해야하는 것까진 생각했는데 그 뒤로는 어떻게 접근해야할지 모르겠어서 구글링을 했다.. 구글링을 했더니 이 문제는 Kruskal 알고리즘으로 풀면 된다는 사실을 알게 되었다. Kruskal 알고리즘이 뭔지 몰라서 공부를 한 후 코드를 짰더니 수월하게 해결할 수 있었다. 이 알고리즘을 알아야 풀 수 있는 문제였다
Kruskal 알고리즘
- 탐욕적인 방법을 이용하여 네트워크(가중치를 간선에 할당한 그래프)의 모든 정점을 최소 비용으로 연결하는 최적 해답을 구하는 것
탐욕적인 방법이란?
결정을 해야 할 때마다 그 순간에 가장 좋다고 생각되는 것을 선택함으로써 최종적인 해답에 도달하는 것
탐욕적인 방법은 그 순간에는 최적이지만, 전체적인 관점에서 최적이라는 보장이 없기 때문에 반드시 검증해야 한다
1) 최소 비용의 간선으로 구성됨 2) 사이클을 포함하지 않음 의 조건에 근거하여 각 단계에서 사이클을 이루지 않는 최소 비용 간선을 선택 한다.
Kruskal 알고리즘의 동작
- 그래프의 간선들을 가중치의 오름차순으로 정렬한다.
- 정렬된 간선 리스트에서 순서대로 사이클을 형성하지 않는 간선을 선택한다.
즉, 가장 낮은 가중치를 먼저 선택한다. 사이클을 형성하는 간선을 제외한다. 해당 간선을 현재의 MST(최소 비용 신장 트리)의 집합에 추가한다.
def solution(n, costs):
answer = 0
costs.sort(key = lambda x: x[2]) # 비용기준으로 오름차순 정렬
connect = set([costs[0][0]]) # 연결을 확인하는 집합
# Kruskal 알고리즘으로 최소 비용 구하기
while len(connect) != n:
for cost in costs:
if cost[0] in connect and cost[1] in connect:
continue
if cost[0] in connect or cost[1] in connect:
connect.update([cost[0], cost[1]])
answer += cost[2]
break
return answer
먼저 비용을 기준으로 costs를 오름차순으로 정렬한다. connect는 연결된 섬을 확인하는 집합입니다. 섬이 중복되면 안되므로 리스트가 아닌 집합을 사용한다. 그 다음 Kruskal 알고리즘을 통해 최소 비용을 구한다. 반복문으로 costs를 돌면서 두 섬이 connect에 있으면 넘어가고 두 섬 중 하나만 있는 경우 두 섬을 connect에 추가해주고 answer에 비용을 추가한다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Python] N으로 표현 - Level3 (0) | 2021.07.12 |
---|---|
[프로그래머스/Python] 단속카메라 - Level3 (0) | 2021.06.29 |
[프로그래머스/Python] 구명보트 - Level2 (0) | 2021.06.26 |
[프로그래머스/Python] 무지의 먹방 라이브 (0) | 2021.06.15 |
[프로그래머스/Python] 큰 수 만들기 - Level2 (0) | 2021.06.14 |