최소 신장 트리 를 구현하기 위해서 Java에서는 Kruskal 알고리즘을 사용한다고 합니다.
문제풀다가 이게 뭐지.. 싶어서 최소 신장 트리는 들어봤는데 코드로 구현하는 건 역시.. 또 다른 문제입니다.
아래 그림이 전체 과정을 설명해준다고 해요.
edge 선언 및 초기화 -> 목표값에 따른 오름차순 배열 -> Union-Find -> 간선 선택 및 사이클 체크 -> 결과값 확인
이것도 몇 번 직접 구현해봐야 익숙해질 것 같습니다. for 문으로는 한계가 있더라구요 ;
Kruskal 알고리즘
최소 신장 트리를 찾기 위해 간선들을 오름차순 정렬하고,
서로소 집합(Union-Find)으로 사이클이 생기지 않도록 간선을 추가하는 방식
✅ 1. Kruskal 알고리즘이란?
✅ 개념:
- 그래프에서 사이클이 없고, 모든 노드를 연결하는 가장 작은 비용의 간선 집합을 찾는 알고리즘
- 즉, 최소 신장 트리(MST: Minimum Spanning Tree) 를 구하는 대표적인 알고리즘 중 하나
Kruskal 알고리즘 동작 순서 (요약):
- 모든 간선을 오름차순(비용 기준)으로 정렬
- 간선을 하나씩 선택하면서
- 해당 간선을 추가해도 사이클이 생기지 않으면 선택
- 이때 Union-Find(서로소 집합) 을 사용해 사이클을 체크함
- 선택된 간선이 N-1개가 되면 완료
1. 간선 저장 + 정렬
List<int[]> edges = new ArrayList<>();
edges.add(new int[]{a, b, cost});
edges.sort(Comparator.comparingInt(o -> o[2]));
- 모든 간선을 하나의 리스트에 저장하고,
- 비용 순으로 정렬해서 작은 것부터 고려함
2. Union-Find 구조
parent = new int[n + 1];
for (int i = 1; i <= n; i++) parent[i] = i;
- 각 노드를 자기 자신이 부모인 집합으로 초기화
- 나중에 union(a, b)로 서로 연결해주면 하나의 트리가 됨
3. 간선 선택 + 사이클 체크
if (find(a) != find(b)) {
union(a, b);
totalCost += cost;
connectedEdges++;
}
- find()로 부모가 다르면 → 사이클이 아니다 → 선택 가능!
- 비용 누적
- 연결 간선 수 증가
4. 종료 조건
if (connectedEdges == n - 1) break;
- MST는 정점 N개를 정확히 N-1개의 간선으로 연결
- 간선이 N-1개가 되면 더 이상 선택할 필요 없음!
이렇게 새로운 알고리즘 구현에 대해서 배웠습니다.
개념을 아는것과 구현은 진짜 너무 다르네요ㅠ
'Bootcamp > java codingtest' 카테고리의 다른 글
동적 계획법, JAVA 자료형 (1) | 2025.04.21 |
---|---|
BigDecimal, Comparator 인터페이스 (0) | 2025.04.20 |
문자열 리스트, array (0) | 2025.04.14 |
재귀 (0) | 2025.04.12 |
BigInteger, array 정렬 (0) | 2025.04.08 |