Tags
- ๊ทธ๋ํ ์ด๋ก
- Dynamic Programming
- dfs
- ๋ฌธ์์ด
- CodingTest
- Python
- ์ํ
- ์ ๋ ฌ
- ๊ต์ฌ
- LV2
- ๊ตฌํ
- ์๋ฃ๊ตฌ์กฐ
- ์ ์๋ก
- ๊ทธ๋ํ ํ์
- stack
- PGM
- ๋๋น ์ฐ์ ํ์
- Study
- greedy
- ๋ฐฑํธ๋ํน
- Brute Force Algorithm
- ๊น์ด ์ฐ์ ํ์
- BOJ
- queue
- DP
- BFS
- sort
- Java
- SpringBoot
- ์๋ฎฌ๋ ์ด์
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_1043 : ๊ฑฐ์ง๋ง ๋ณธ๋ฌธ
1043๋ฒ: ๊ฑฐ์ง๋ง
์ง๋ฏผ์ด๋ ํํฐ์ ๊ฐ์ ์ด์ผ๊ธฐ ํ๋ ๊ฒ์ ์ข์ํ๋ค. ํํฐ์ ๊ฐ ๋๋ง๋ค, ์ง๋ฏผ์ด๋ ์ง๋ฏผ์ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค. ์ง๋ฏผ์ด๋ ๊ทธ ์ด์ผ๊ธฐ๋ฅผ ๋งํ ๋, ์๋ ๊ทธ๋๋ก ์ง์ค๋ก ๋งํ๊ฑฐ๋ ์์ฒญ๋๊ฒ
www.acmicpc.net
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- ๋ฌธ์ ๋ด์ฉ
- N๋ช ์ ์ฌ๋๊ณผ M๊ฐ์ ํํฐ๊ฐ ์๋ค.
- ์ง์ค์ ์๋ ์ฌ๋์ด ์ฐธ์ฌํ ํํฐ์์๋ ์ง์ค๋ง ๋งํด์ผ ํ๋ค.
- ์ง์ค์ ๋งํ ํํฐ์ ์๋ ์ฌ๋๋ค๋ ์ง์ค์ ์๋ ์ฌ๋์ด ๋๋ค.
- ๊ฑฐ์ง์ ๋งํ ์ ์๋ ํํฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
- ํ์ด ์ ๋ต
- ๊ฐ์ ํํฐ ์ฐธ๊ฐ์๋ฅผ ์ฐ๊ฒฐํด์ผ ํ๋ค.
- ๊ฐ ํํฐ๋ณ ์ฐธ๊ฐ์ List์ ๊ฐ์ธ ๋ณ ์ฐธ๊ฐ ํํฐ List๋ฅผ ๋ง๋ ๋ค.
- BFS๋ก ์ง์ค์ ๋งํ ํํฐ์ ์ง์ค์ ์๊ฒ๋ ์ฌ๋๋ค์ ์ถ๊ฐํด ๋๊ฐ๋ค.
- ์ง์ค์ ๋งํ์ง ์์ ํํฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
- 2024.04.22 ์ถ๊ฐ
- ๊ธฐ์กด์ BFS๋ฅผ ํตํด ํ์ดํ์ง๋ง, ๋ถ๋ฆฌ ์งํฉ์ผ๋ก๋ ํ์ดํ ์ ์์ด์ ๋ค์ ํ์ด๋ณด์๋ค.
- ๊ฐ์ ํํฐ์ ์ฐธ๊ฐํ ์ธ์๋ค์ union ์ฐ์ฐ์ผ๋ก ๊ฐ์ ์งํฉ์ ๋ฃ์ด์ค๋ค.
- ํํฐ์ ์งํฉ์ ์ง์ค์ ์๋ ์ฌ๋๋ค์ด ํฌํจ๋์ด ์์ง ์์ผ๋ฉด ์นด์ดํธํ๋ค.
๐ธ ์ฝ๋ ๐ธ
import java.io.*;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
ArrayList<Integer>[] person = new ArrayList[N + 1];
ArrayList<Integer>[] party = new ArrayList[M];
Boolean[] know = new Boolean[N + 1];
Boolean[] visited = new Boolean[M];
for (int i = 1; i <= N; i++) {
person[i] = new ArrayList<>();
know[i] = false;
}
for (int i = 0; i < M; i++) {
party[i] = new ArrayList<>();
visited[i] = false;
}
for (int i = 0; i < M; i++) {
StringTokenizer st1 = new StringTokenizer(br.readLine());
int person_cnt = Integer.parseInt(st1.nextToken());
for (int j = 0; j < person_cnt; j++) {
int ps = Integer.parseInt(st1.nextToken());
party[i].add(ps); // ํํฐ ๋ณ ์ฐธ๊ฐ์ ๊ธฐ๋ก
person[ps].add(i); // ๊ฐ์ธ ๋ณ ์ฐธ๊ฐ ํํฐ ๊ธฐ๋ก
}
}
// BFS
int cnt = M;
Queue<Integer> que = new ArrayDeque<>();
// ์ฒ์ ๋ถํฐ ์ง์ค์ ์๋ ์ฌ๋๋ค ํ ์ด๊ธฐํ
int know_cnt = Integer.parseInt(st.nextToken());
for (int i = 0; i < know_cnt; i++) {
int k = Integer.parseInt(st.nextToken());
know[k] = true;
que.add(k);
}
while (!que.isEmpty()) {
int np = que.poll();
for (int pt : person[np]) {
if (!visited[pt]) {
visited[pt] = true;
cnt--;
for (int ps : party[pt]) {
if (!know[ps]) {
know[ps] = true;
que.add(ps);
}
}
}
}
}
// Output
bw.write(Integer.toString(cnt));
bw.flush();
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- ๊ฐ์ธ ๋ณ ์ฐธ๊ฐํ ํํฐ ๋ฒํธ, ํํฐ ๋ณ ์ฐธ๊ฐ์ ๋ฒํธ๋ฅผ ArrayList์ ์ ๋ ฅ๋ฐ๋๋ค.
- ์ฒ์๋ถํฐ ์ง์ค์ ์๋ ์ฌ๋๋ค์ ํ์ ์ด๊ธฐ๊ฐ์ผ๋ก ๋ฃ๋๋ค.
- ์ง์ค์ ์๋ ์ฌ๋ ๋ช ๋จ know ๋ฐฐ์ด์ true๋ก ๋ฐ๊พผ๋ค.
- ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํ๋ฉฐ ์ง์ค์ ์๋ ์ฌ๋๋ค์ ์ถ๊ฐํ๋ค.
- ํ์ฌ ์ฐธ๊ฐ์๊ฐ ์ฐธ์ฌํ ํํฐ ๋ชฉ๋ก์ ์ํํ๋ค.
- ์์ง ๊ฑฐ์ง ํํฐ์์ผ๋ฉด, ์ง์ค์ ๋ค์์ผ๋ฏ๋ก visited๋ฅผ true๋ก ๋ฐ๊พธ๊ณ ,
๊ฑฐ์ง ํํฐ์ ์ cnt๋ฅผ -1ํ๋ค. - ํด๋น ํํฐ์ ์์ ๋ ์ฐธ๊ฐ์๋ค ์ค ์ง์ค์ ์๊ฒ๋ ์ฌ๋๋ค์ ํ์ ๋ฃ๊ณ know๋ true๋ก ๋ฐ๊ฟ์ค๋ค.
- cnt๋ฅผ ์ถ๋ ฅํ๋ค.
๐ธ ๋ถ๋ฆฌ ์งํฉ ์ฝ๋ ๐ธ
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
private static int[] parent;
public static void main(String[] args) throws IOException {
// Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int known = Integer.parseInt(st.nextToken());
if (known == 0) {
bw.write(Integer.toString(M));
bw.flush();
return;
}
parent = new int[N + 1];
for (int i = 1; i <= N; i++) {
parent[i] = i;
}
// Disjoint Set
int[] knowns = new int[known]; // ์ฌ์ค์ ์๋ ์ฌ๋๋ค
ArrayList<Integer>[] list = new ArrayList[M];
for (int i = 0; i < known; i++) {
knowns[i] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i < M; i++) {
list[i] = new ArrayList<>();
st = new StringTokenizer(br.readLine());
int people = Integer.parseInt(st.nextToken());
int first = Integer.parseInt(st.nextToken());
list[i].add(first);
first = find(first);
for (int j = 1; j < people; j++) {
int member = Integer.parseInt(st.nextToken());
list[i].add(member);
union(first, member);
}
}
int cnt = 0;
for (int i = 0; i < M; i++) {
boolean flag = true;
int pp = find(list[i].get(0));
for (int j = 0; j < known; j++) {
if (find(pp) == find(knowns[j])) {
flag = false;
break;
}
}
if (flag) cnt++;
}
// Output
bw.write(Integer.toString(cnt));
bw.flush();
}
private static void union(int a, int b) {
int ap = find(a);
int bp = find(b);
if (ap != bp) parent[ap] = bp;
}
private static int find(int a) {
if (parent[a] == a) return a;
return parent[a] = find(parent[a]);
}
}
๐ธ end ๐ธ
- ์์(์ฐ๊ฒฐ) ์ ๋ณด๋ฅผ ArrayList๋ก ์ ์ฅํ ๋ค BFS๋ฅผ ํตํด ์ฝ๊ฒ ํ์ดํ ์ ์์๋ค.
- ๋ฌธ์ ํ๊ทธ์ ๋ถ๋ฆฌ ์งํฉ(Disjoint Set) ์ด ์๊ธธ๋ ํด๋น ํ์ด๋ฅผ ์ฐพ์๋ณด์๋ค. (์ฐธ๊ณ ํฌ์คํ
)
- ์ฐ๊ฒฐ ๋์ด ์๋ ์ฐธ๊ฐ์๋ค์ ๊ฐ์ ์งํฉ์ ํฌํจ๋์ด์๋ค๊ณ ๋ณด๊ณ , ์งํฉ์ ํ ์์๊ฐ ์ง์ค์ ์๊ฒ ๋๋ฉด ํด๋น ์งํฉ ๋ชจ๋ ์ง์ฌ์ ์๋ ๋ฐฉ์์ ํ์ด์๋ค.
- ์ผ๋ฐ์ ์ธ Union-Find์ ๋ค๋ฅด๊ฒ, ์งํฉ ๋ด ์์ ๋ชจ๋ ์ง์ค์ ์๊ฒ ๋๋์ง ํ์ธ์ด ํ์ํ๊ณ , ๊ฑฐ์ง ํํฐ์ ์นด์ดํธ๊ฐ ํ์ํด์ ์ถ๊ฐ์ ์ธ ์์ด๋์ด๊ฐ ํ์ํ ๊ฒ ๊ฐ๋ค.
- ๋ฌธ์ ๋ถ์๊ณผ ํ์ด ๊ณํ์ ์ ์ด๊ฐ๋ฉฐ ํ์ดํ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_1167 : ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2023.06.25 |
---|---|
BOJ_15663 : N๊ณผ M (9) (0) | 2023.06.11 |
BOJ_1149 : RGB๊ฑฐ๋ฆฌ (0) | 2023.06.08 |
Lv.1 : ๊ณต์ ์ฐ์ฑ (0) | 2023.04.26 |
Lv.1 : ์ถ์ต ์ ์ (0) | 2023.04.25 |