📝 문제

https://programmers.co.kr/learn/courses/30/lessons/42861

🎯 풀이

Kruskal 알고리즘으로 풀어내면 쉬운 문제.
Kruskal 알고리즘은 Union-find + Sorting 이 더해진 알고리즘이다.

Union-find 없이 최저비용 연결만 진행하면 Cycle이 발생할 수 있다.
이 때문에 Union-find가 적용되면 좋은데,
최저비용(오름차순 정렬) + Union-find = Kruskal
결국 Kruskal 이라는 말이다.

Kruskal 알고리즘에 대한 자세한 설명은 안경잡이개발자님 블로그에 잘 정리되어 있다.

def solution(n, costs):
    answer = 0
    costs.sort(key=lambda x: x[2]) # 비용기준 오름차순 정렬
    union = [i for i in range(n)]  # union-find 리스트 선언.
    
    for s, d, cost in costs:
        if union[s] != union[d]:   # union-find 값이 같으면 이미 연결된 상태.
            dest = union[d]
            for i in range(n):     # 도착섬과 같은 값들을 모두 시작섬으로 변경
                if union[i] == dest:
                    union[i] = union[s]
            answer += cost         # 최저 비용 더하기.
        
            check_point = 0        # 모든 섬이 연결되었나 판별.
            for c in range(n-1):
                if union[c] != union[c+1]:
                    check_point = 1
            if check_point == 0:
                break
                
    return answer

프로그래머스 파이썬 문제풀이는 정말 오랜만에 하는 것 같다.
LEVEL 3 부터 급격히 높아진 난이도에 많이 주저했었는데,
이제 조금씩 풀어내는걸 보면 실력이 늘긴 느나보다. 😆

댓글남기기