// education

15. 최소 신장 트리(MST) - 크루스칼(Kruskal: Union-Find)과 프림(Prim: Priority Queue)

무방향 가중치 그래프에서 모든 정점을 연결하는 부부 그래프 중 가중치의 합이 최소가 되는 **최소 신장 트리(MST: Minimum Spanning Tree)**를 다룹니다.


4. 실전 파이썬(Python 3) 알고리즘 구현 코드 및 라인별 주석 해설

본 레슨의 핵심 연산 매커니즘을 파이썬 3 환경에서 가장 효율적이고 직관적으로 구현한 실전 소스 코드입니다. 모든 주요 라인마다 상세한 한글 주석이 기재되어 있어 코드의 흐름을 쉽고 명확하게 이해할 수 있습니다.

# 서로소 집합 (Disjoint Set / Union-Find) 구현
class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n + 1))
        
    def find(self, i):
        """경로 압축(Path Compression)이 적용된 root 정점 탐색"""
        if self.parent[i] == i:
            return i
        self.parent[i] = self.find(self.parent[i])  # 재귀적 경로 압축
        return self.parent[i]
        
    def union(self, i, j):
        """두 정점의 집합을 병합 (사이클이 형성되면 False 반환)"""
        root_i = self.find(i)
        root_j = self.find(j)
        if root_i != root_j:
            self.parent[root_i] = root_j
            return True
        return False

def kruskal(n: int, edges: list) -> int:
    """크루스칼 MST 알고리즘"""
    # 1. 간선 가중치 오름차순 정렬
    edges.sort()
    uf = UnionFind(n)
    mst_cost = 0
    
    # 2. 가중치가 작은 간선부터 순차 선택하며 사이클 형성 여부 검사
    for w, u, v in edges:
        if uf.union(u, v):  # 사이클이 발생하지 않을 때만 간선 채택
            mst_cost += w
    return mst_cost

if __name__ == "__main__":
    edges = [(29, 1, 2), (75, 1, 6), (35, 2, 3), (34, 2, 6), (7, 3, 4), (23, 4, 6), (13, 4, 5)]
    print("MST 최소 신장 트리 가중치 합:", kruskal(6, edges))

파이썬 소스 코드 핵심 포인트 해설

  1. self.find(): 경로 압축(Path Compression) 기법으로 탐색 시간을 $O(alpha(N))$ 분할상환 상수 타임으로 단축하는 주석 해설입니다.

5. 알고리즘 설계 및 최적화 실무 지침 (Best Practices & Complexity Audit)

15. 최소 신장 트리(MST) - 크루스칼(Kruskal: Union-Find)과 프림(Prim: Priority Queue) 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

1) 공간/시간 복잡도 한계 및 메모리 사용 제어

2) 예외 케이스(Edge Cases) 및 코딩 테스트 체크리스트

  1. 입력 경계값 검증: $N=1$ 이거나 $N=0$ 인 극단적 최소 입력, 혹은 모든 요소의 값이 동일한 경우(Corner Case)에 대한 예외 처리를 누락하지 않습니다.
  2. 무한 루프 및 사이클 감지: 그래프/트리 탐색 시 방문 처리 배열(visited[])의 업데이트 위치를 정확히 지정하여 중복 큐 삽입으로 인한 메모리 초과를 예방합니다.

6. 핵심 요약 및 실무 FAQ (Summary & Q&A)

Q1. 파이썬 코드 주석에서 강조된 성능 핵심은 무엇인가요?

Q2. 실무 개발에서 본 파이썬 알고리즘 패턴은 어디에 활용되나요?

← 이전14. 모든 쌍 최단 경로 알고리즘 - 플로이드-워셜(Floyd-Warshall $O(V^3)$)과 경유지 DP 다음 →16. 위상 정렬(Topological Sort)과 방향 비순환 그래프(DAG) - 진입 차수와 Kahn 알고리즘