[PROGRAMMERS]-섬 연결하기(Greedy)

zioo·2022년 2월 3일
0

📃 섬 연결하기

풀이

Kruskal 알고리즘

  • 탐욕적인 방법을 이용하여 네트워크(가중치를 간선에 할당한 그래프)의 모든 정점을 최소 비용으로 연결하는 최적 해답을 구하는 것

탐욕적인 방법이란?

  • 결정을 해야 할 때마다 그 순간에 가장 좋다고 생각되는 것을 선택함으로써 최종적인 해답에 도달하는 것
  • 탐욕적인 방법은 그 순간에는 최적이지만, 전체적인 관점에서 최적이라는 보장이 없기 때문에 반드시 검증해야 한다
    1) 최소 비용의 간선으로 구성됨 2) 사이클을 포함하지 않음 의 조건에 근거하여 각 단계에서 사이클을 이루지 않는 최소 비용 간선을 선택 한다.

Kruskal 알고리즘의 동작

  • 그래프의 간선들을 가중치의 오름차순으로 정렬한다.
  • 정렬된 간선 리스트에서 순서대로 사이클을 형성하지 않는 간선을 선택한다.
    즉, 가장 낮은 가중치를 먼저 선택한다. 사이클을 형성하는 간선을 제외한다. 해당 간선을 현재의 MST(최소 비용 신장 트리)의 집합에 추가한다.

코드

def solution(n, costs):    
    answer = 0 
    costs.sort(key = lambda x : x[2])
    connect = set([costs[0][0]]) # 연결을 확인하는 집합
    while n != len(connect):
        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
  • connect는 연결된 섬을 확인하는 집합
  • 섬이 중복되면 안되므로 리스트가 아닌 집합을 사용
  • Kruskal 알고리즘을 통해 최소 비용을 구한다.
  • 반복문으로 costs를 돌면서 두 섬이 connect에 있으면 넘어가고 두 섬 중 하나만 있는 경우 두 섬을 connect에 추가해주고 answer에 비용을 추가한다.

0개의 댓글