오랜만에 코딩 테스트 공부를 했다.
오랜만에 하자마자 만난 문제가 처음 만나보는 알고리즘 문제였다.
Floyd-Warshall Algorithm
처음에는 Floyd-Warshall 알고리즘으로 풀려고 시도했다.
왜냐하면, Floyd-Warshall은 모든 정점에서 시작하는 최단경로를 구하기 때문이다.
하지만, Floyd-Warshall을 사용하는 경우에는 다음과 같은 문제가 발생한다.
- Floyd-Warshall은 정점과 정점간의 최단 경로 밖에 구하지 못한다.
- 즉, 모든 정점을 지나왔는지 알 방법이 없다는 말이다.
- 그렇다면 모든 정점에서 시작하는 DFS와 결합을 한다면?
- 시간 복잡도 상 좋지 않은 Code가 될 것이다.
- 이미 Floyd-Warshall 부터가 O(N^3)인 상태이다.
위와 같은 이유로 다른 알고리즘을 생각해보다 결국 검색을 했다.
Kruskal Algorithm
Kruskal Algorithm 은 MST를 구하는 알고리즘이다.
여기서 MST란 Minimum Spannig Tree로, 즉 최소 신장 트리 를 의미한다.
또한, 이 Algorithm을 이해하기 위해선 Union Find 에 대해 알고 있어야 한다.
Spanning Tree란?
- 순환 없이 모든 노드가 연결된 그래프를 말한다.
- 간선의 수가 최소 간선으로,
정점의 수 - 1
이 된다. - 사실상, 정점을 Root로 모든 그룹 멤버들을 자식으로 갖는 Tree 구조이다.
그럼 MST는?
- Spanning Tree는 여러개가 될 수 있는데, 그 중 가중치의 합이 가장 작은 Tree이다.
- Prim Algorithm, Kruskal Algorithm 등의 알고리즘으로 구할 수 있다.
그렇다면 Kruskal Algorithm은?
정의는 모든 Node를 최소한의 가중치로 연결하는 Algorithm이다.
- 저장된 가중치를 오름차순으로 정렬한다.
- 적은 가중치의 간선부터 하나씩 추가한다.
- 그래프가 Cycle 없이 모든 Node가 연결되었으면 종료한다.