문제 출처: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV_mSnmKUckDFAWb&categoryId=AV_mSnmKUckDFAWb&categoryType=CODE&problemTitle=%EC%B5%9C%EC%86%8C+%EC%8A%A4%ED%8C%A8%EB%8B%9D&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Solution {
private static class Edge implements Comparable<Edge> {
int from;
int to;
int weight;
public Edge(int from, int to, int weight) {
this.from = from;
this.to = to;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
return this.weight - o.weight;
}
}
private static int[] parents;
private static void makeSet(int N) {
parents = new int[N + 1];
for (int i = 1; i < N + 1; i++) parents[i] = i;
}
private static int findSet(int n) {
if (n == parents[n]) return n;
return parents[n] = findSet(parents[n]);
}
private static boolean unionSet(int a, int b) {
int aRoot = findSet(a);
int bRoot = findSet(b);
if (aRoot == bRoot) return false;
parents[bRoot] = aRoot;
return true;
}
public static void main(String[] args) throws Exception {
StringBuilder sb = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(reader.readLine());
for (int i = 0; i < T; i++) {
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
int V = Integer.parseInt(tokenizer.nextToken());
int E = Integer.parseInt(tokenizer.nextToken());
Edge[] edgeList = new Edge[E];
for (int j = 0; j < E; j++) {
tokenizer = new StringTokenizer(reader.readLine());
int from = Integer.parseInt(tokenizer.nextToken());
int to = Integer.parseInt(tokenizer.nextToken());
int weight = Integer.parseInt(tokenizer.nextToken());
edgeList[j] = new Edge(from, to, weight);
}
Arrays.sort(edgeList);
makeSet(V);
int result = 0;
int cnt = 0;
for (Edge edge : edgeList) {
if (unionSet(edge.from, edge.to)) {
result += edge.weight;
if (++cnt == V - 1) break;
}
}
sb.append("#").append(i + 1).append(" ");
sb.append(result).append("\n");
}
System.out.println(sb);
}
}
- Union-Find 알고리즘을 활용한 Kruskal 알고리즘 구현을 통해 해결할 수 있는 기본적인 문제였다.