문제
코드
맞았습니다가 뜬 코드입니다. - 메모리 51140KB | 시간 464ms | 코드 길이 1485B
import java.io.*;
import java.util.*;
public class Main {
private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static int[] parent;
public static void main(String[] args) throws IOException {
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
parent = new int[n];
for(int i = 0 ; i < n ; i++) {
parent[i] = i;
}
for(int i = 0 ; i < m ; i++) {
StringTokenizer st_node = new StringTokenizer(bf.readLine());
int x = Integer.parseInt(st_node.nextToken()) - 1;
int y = Integer.parseInt(st_node.nextToken()) - 1;
union_root(x, y);
}
StringTokenizer st_order = new StringTokenizer(bf.readLine());
int[] order = new int[n];
for(int i = 0 ; i < n ; i++) {
order[i] = Integer.parseInt(st_order.nextToken()) - 1;
}
int cnt = 0;
for(int i = 0 ; i < n-1 ; i++) {
if(find_root(order[i]) != find_root(order[i + 1])) {
cnt ++;
}
}
bw.write(Integer.toString(cnt));
bf.close();
bw.flush();
bw.close();
}
private static int find_root(int x) {
if(x == parent[x]) {
return x;
}
return parent[x] = find_root(parent[x]);
}
private static void union_root(int x, int y) {
x = find_root(x);
y = find_root(y);
if(x != y) {
parent[x] = y;
}
}
}
분리 집합을 이용한 풀이입니다.
parent 배열에는 각 인덱스(노드)에 대한 루트노드를 넣습니다.
find_root에서는 매개변수로 들어올 값의 루트노드를 리턴합니다.
union_root에서는 매개변수로 두 값을 받아서 두 노드를 병합해줍니다.
find_root 로는 루트노드를 알게 되고, 이를 이용하여 union_root로 두 노드를 병합한다고 보시면 됩니다.
https://4legs-study.tistory.com/94
분리 집합 (Disjoint Set) : Union-Find
서론 다음과 같은 메신저 프로그램이 있다. "A와 B가 친구 관계이고, 내가 A와 친구 관계이면 자동으로 나와 B는 친구 관계가 된다." 이 메신저 프로그램을 통해 내가 A라는 사람과 친구 관계를 맺
4legs-study.tistory.com
위 링크에 설명이 잘 되어있습니다.
'코딩테스트' 카테고리의 다른 글
[백준] 11404번 '플로이드' - Java (1) | 2023.07.09 |
---|---|
[백준] 1339번 '단어 수학' - Java (1) | 2023.07.08 |
[백준] 16562번 '친구비' - Java (2) | 2023.07.06 |
[백준] 12865번 '평범한 배낭' - Java (2) | 2023.07.05 |
[백준] 1303번 '전쟁 - 전투' - Java (2) | 2023.07.04 |