Tags
- ๊น์ด ์ฐ์ ํ์
- SpringBoot
- PGM
- ์ํ
- stack
- dfs
- ๊ตฌํ
- ๊ต์ฌ
- ๋๋น ์ฐ์ ํ์
- ๊ทธ๋ํ ์ด๋ก
- ์ ์๋ก
- ๋ฌธ์์ด
- ์๋ฃ๊ตฌ์กฐ
- BOJ
- greedy
- queue
- CodingTest
- Dynamic Programming
- sort
- ์๋ฎฌ๋ ์ด์
- LV2
- BFS
- Brute Force Algorithm
- ๊ทธ๋ํ ํ์
- DP
- ์ ๋ ฌ
- Study
- Python
- Java
- ๋ฐฑํธ๋ํน
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_1043 : ๊ฑฐ์ง๋ง ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- ๋ฌธ์ ๋ด์ฉ
- 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 |