- Today
- Total
- spring
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ๋ค์ต์คํธ๋ผ
- ํ๋ก๊ทธ๋๋จธ์ค
- ์์์ ๋ ฌ
- ๋ฐฑ์๋
- BFS
- ๋ฌธ๋ฒ
- CS
- leetcode
- ๊ตฌํ
- ์๋ฃ๊ตฌ์กฐ
- dp
- Algorithm
- ๋ฒจ๋งํฌ๋
- pytorch
- Graph
- ๊ทธ๋ฆฌ๋
- MST
- database
- ์ธํด
- ๋ฐฑ์ค
- OOP
- tree
- ์กธ์ ์ํ
- array
- java
- PS
- ์๋ฐ
- ์๋ฐ์์ ์
Partially Committed
[๋ฐฑ์ค 1043] ๊ฑฐ์ง๋ง(JAVA) - Union&Find ๋ณธ๋ฌธ
[๋ฐฑ์ค 1043] ๊ฑฐ์ง๋ง(JAVA) - Union&Find
WonderJay 2023. 1. 16. 12:42https://www.acmicpc.net/problem/1043
๋ฌธ์
์ง๋ฏผ์ด๋ ํํฐ์ ๊ฐ์ ์ด์ผ๊ธฐ ํ๋ ๊ฒ์ ์ข์ํ๋ค. ํํฐ์ ๊ฐ ๋๋ง๋ค, ์ง๋ฏผ์ด๋ ์ง๋ฏผ์ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค. ์ง๋ฏผ์ด๋ ๊ทธ ์ด์ผ๊ธฐ๋ฅผ ๋งํ ๋, ์๋ ๊ทธ๋๋ก ์ง์ค๋ก ๋งํ๊ฑฐ๋ ์์ฒญ๋๊ฒ ๊ณผ์ฅํด์ ๋งํ๋ค. ๋น์ฐํ ๊ณผ์ฅํด์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฌ๋ฏธ์๊ธฐ ๋๋ฌธ์, ๋๋๋ก์ด๋ฉด ๊ณผ์ฅํด์ ์ด์ผ๊ธฐํ๋ ค๊ณ ํ๋ค. ํ์ง๋ง, ์ง๋ฏผ์ด๋ ๊ฑฐ์ง๋ง์์ด๋ก ์๋ ค์ง๊ธฐ๋ ์ซ์ดํ๋ค. ๋ฌธ์ ๋ ๋ช๋ช ์ฌ๋๋ค์ ๊ทธ ์ด์ผ๊ธฐ์ ์ง์ค์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฐ ์ฌ๋๋ค์ด ํํฐ์ ์์ ๋๋, ์ง๋ฏผ์ด๋ ์ง์ค์ ์ด์ผ๊ธฐํ ์ ๋ฐ์ ์๋ค. ๋น์ฐํ, ์ด๋ค ์ฌ๋์ด ์ด๋ค ํํฐ์์๋ ์ง์ค์ ๋ฃ๊ณ , ๋๋ค๋ฅธ ํํฐ์์๋ ๊ณผ์ฅ๋ ์ด์ผ๊ธฐ๋ฅผ ๋ค์์ ๋๋ ์ง๋ฏผ์ด๋ ๊ฑฐ์ง๋ง์์ด๋ก ์๋ ค์ง๊ฒ ๋๋ค. ์ง๋ฏผ์ด๋ ์ด๋ฐ ์ผ์ ๋ชจ๋ ํผํด์ผ ํ๋ค.
์ฌ๋์ ์ N์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด์ผ๊ธฐ์ ์ง์ค์ ์๋ ์ฌ๋์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ํํฐ์ ์ค๋ ์ฌ๋๋ค์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ง๋ฏผ์ด๋ ๋ชจ๋ ํํฐ์ ์ฐธ๊ฐํด์ผ ํ๋ค. ์ด๋, ์ง๋ฏผ์ด๊ฐ ๊ฑฐ์ง๋ง์์ด๋ก ์๋ ค์ง์ง ์์ผ๋ฉด์, ๊ณผ์ฅ๋ ์ด์ผ๊ธฐ๋ฅผ ํ ์ ์๋ ํํฐ ๊ฐ์์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ฌ๋์ ์ N๊ณผ ํํฐ์ ์ M์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค์๋ ์ด์ผ๊ธฐ์ ์ง์ค์ ์๋ ์ฌ๋์ ์์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ง์ค์ ์๋ ์ฌ๋์ ์๊ฐ ๋จผ์ ์ฃผ์ด์ง๊ณ ๊ทธ ๊ฐ์๋งํผ ์ฌ๋๋ค์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ฌ๋๋ค์ ๋ฒํธ๋ 1๋ถํฐ N๊น์ง์ ์๋ก ์ฃผ์ด์ง๋ค.
์ ์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์๋ ๊ฐ ํํฐ๋ง๋ค ์ค๋ ์ฌ๋์ ์์ ๋ฒํธ๊ฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฃผ์ด์ง๋ค.
N, M์ 50 ์ดํ์ ์์ฐ์์ด๊ณ , ์ง์ค์ ์๋ ์ฌ๋์ ์๋ 0 ์ด์ 50 ์ดํ์ ์ ์, ๊ฐ ํํฐ๋ง๋ค ์ค๋ ์ฌ๋์ ์๋ 1 ์ด์ 50 ์ดํ์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฌธ์ ์ ์ ๋ต์ ์ถ๋ ฅํ๋ค.
๊ฐ๊ฐ์ ํํฐ์ ์ฐธ์ฌํ๋ ์ฌ๋๋ค์ ํ๋์ ์งํฉ์ผ๋ก ๋ฌถ์ด์ค๋ค(Union).
๊ทธ๋ฌ๋ฉด k ๋ฒ์งธ ํํฐ์ ์ํ๋ ์ฌ๋๋ค์ ๋ชจ๋ ๊ฐ์ ์งํฉ์ ํด๋นํ๋ค.
k ๋ฒ์งธ ํํฐ์ ์ํ๋ ์ฌ๋๋ค์ ์งํฉ์ ์๊ธฐ ์ํด์,
๊ตณ์ด k ๋ฒ์งธ ํํฐ์ ์ธ์ ์ ์ฒด๋ฅผ ์ํํ ํ์๋ ์๊ณ ,
์ ๋ ฅ์ ๋ฐ์ผ๋ฉด์ ๊ฐ๊ฐ์ ํํฐ์ ์ํ๋ ์ฌ๋๋ค์ ๋ชจ๋ union ํด์ฃผ์๊ธฐ ๋๋ฌธ์
k ๋ฒ์งธ ํํฐ์ ์ฒซ ๋ฒ์งธ ์ฌ๋์ด N ๋ฒ์งธ ์งํฉ์ ์ํ๋ฉด k ๋ฒ์งธ ํํฐ์ ๋ชจ๋ ์ฌ๋์ด N ๋ฒ์งธ ์งํฉ์ ์ํจ์ ์ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๊ฐ๊ฐ์ ํํฐ๋ฅผ ์ํํ๋ฉฐ,
๊ฐ๊ฐ์ ํํฐ์ ์ฒซ๋ฒ ์งธ ์ฌ๋๊ณผ ์ง์ค์ ์๋ ์ฌ๋์ด ๊ฐ์ ์งํฉ์ ์ํ๋ค๋ฉด
ํด๋น ํํฐ์์ ๊ฑฐ์ง๋ง์ ํ๋ฉด ๋คํค๊ฒ ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ง์ค์ ์๋ ์ฌ๋๊ณผ ๊ฐ์ ์งํฉ์ ์ํ์ง ์๋ ํํฐ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์์ค์ฝ๋(JAVA)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static ArrayList<Integer>[] party;
public static int[] parent;
public static void main(String[] args) throws IOException {
int n, m;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(br.readLine());
n = Integer.parseInt(stk.nextToken()); // ์ฌ๋์ ์
m = Integer.parseInt(stk.nextToken()); // ํํฐ์ ์
int k; // ์ง์ค์ ์๋ ์ฌ๋์ ์
stk = new StringTokenizer(br.readLine());
k = Integer.parseInt(stk.nextToken());
int[] true_man = new int[k];
for (int i = 0; i < k; i++) {
true_man[i] = Integer.parseInt(stk.nextToken());
} // ์ง์ค์ ์๋ ์ฌ๋์ ๋ฒํธ๋ฅผ ์ ์ฅ
parent = new int[n + 1];
party = new ArrayList[m];
for (int i = 0; i < m; i++) { // ํํฐ์ ์ ๋งํผ
party[i] = new ArrayList<>();
stk = new StringTokenizer(br.readLine());
int party_size = Integer.parseInt(stk.nextToken());
for (int j = 0; j < party_size; j++) {
party[i].add(Integer.parseInt(stk.nextToken()));
}
}
for (int i = 0; i <= n; i++) {
parent[i] = i;
}
for (int i = 0; i < m; i++) {
int first_man = party[i].get(0);
for (int j = 1; j < party[i].size(); j++) {
union(first_man, party[i].get(j));
} // ๊ฐ๊ฐ์ ํํฐ์ ์ฐธ์ํ ์ธ์๋ค์ ๊ฐ์ ์งํฉ์ผ๋ก ๋ถ๋ฅํจ
}
// parent ๋ฐฐ์ด์ ์ํํ๋ฉฐ ์ง์ค์ ์๋ ์ฌ๋๋ค๊ณผ ๋ค๋ฅธ ์งํฉ์ผ๋ก ๋ถ๋ฅ๋์ด ์๋ค๋ฉด
// ํด๋น ์ฌ๋๋ค์ ๊ฐ์๋ฅผ ๋ํด์ ์ถ๋ ฅํ๋ฉด ๋จ
int cnt = 0;
for (int i = 0; i < m; i++) {
int leader = party[i].get(0);
boolean flag = true;
for (int j = 0; j < k; j++) {
if (isitsame(leader, true_man[j])) {
// ์ง์ค์ ์๋ ์ฌ๋๊ณผ ๊ฐ์ ์งํฉ์ ์ํ๋ค๋ฉด
flag = false;
break;
}
}
if (flag) {
// ์ง์ค์ ์๋ ์ฌ๋๊ณผ ๊ฐ์ ์งํฉ์ ์ํ์ง ์๋๋ค๋ฉด
// ํด๋น ํํฐ์์๋ ๊ฑฐ์ง๋ง์ ํด๋ ๋คํค์ง ์์
cnt++;
}
}
System.out.println(cnt);
}
public static void union(int a, int b) {
a = find(a);
b = find(b);
if (a != b) {
// a ์ b ๊ฐ ๋ค๋ฅธ ์งํฉ์ ์ํ๋ค๋ฉด
parent[b] = a; // ๊ฐ์ ์งํฉ์ผ๋ก ๋ฌถ์ด์ฃผ๊ธฐ
}
}
public static int find(int a) {
if (parent[a] == a) {
// a ์ ๋ถ๋ชจ๊ฐ a ์ด๋ฉด(root)
return a;
} else {
return parent[a] = find(parent[a]);
}
}
public static boolean isitsame(int a, int b) {
if (find(a) == find(b)) { // ๊ฐ์ ์งํฉ์ ์ํ๋ค๋ฉด true
return true;
} else return false;
}
}
'๐ฅ Algorithm || ๋ฌธ์ ํ์ด > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 27210] ์ ์ ๋ชจ์๋ ์ฌ๋น(JAVA) (0) | 2023.01.16 |
---|---|
[๋ฐฑ์ค 1912] ์ฐ์ํฉ (JAVA) (0) | 2023.01.16 |
[Algorithm] Palindrome Check (0) | 2022.10.26 |
[Algorithm] Non-Constructible Value (0) | 2022.10.25 |
[Algorithm] Tournament Winner (0) | 2022.10.25 |