๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1043)
< ๊ฑฐ์ง๋ง >
๋ฌธ์ ํ์ด & ์๊ฐ
ํํฐ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ผ๋ฉด์ ํํฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ฉฐ, ํํฐ์ ์ค๋ ์ฌ๋๋ค์ ์ธ์ ๋ฆฌ์คํธ๋ก ์ ์ฅํ๋ค.
๊ทธ ํ์ ์ง์ค์ ์๋ ์ฌ๋์ ๊ธฐ์ค์ผ๋ก bfs ํ์์ ํตํด ์ง์ค์ ๋ฃ๋ ์ฌ๋๋ค์ ํ๋ณํ๋ค.
์ธ์ ๋ฆฌ์คํธ์๋ ๋ง์ฝ ํํฐ์ 1 2 3์ด ์จ๋ค๋ฉด (1,2) (1,3) (2,3)์ ๊ฐ๊ฐ ์ ์ฅํ๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class _1043_ { // ๊ฑฐ์ง๋ง
static boolean visited[], result[];
static ArrayList<ArrayList<Integer>> arr, party;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
visited = new boolean[n + 1];
result = new boolean[n + 1];
arr = new ArrayList<>(); // ์ธ์ ๋ฆฌ์คํธ
party = new ArrayList<>(); // ํํฐ
for (int i = 0; i < n + 1; i++) {
arr.add(new ArrayList<>());
}
for (int i = 0; i < m; i++) {
party.add(new ArrayList<>());
}
st = new StringTokenizer(bf.readLine());
int num = Integer.parseInt(st.nextToken());
for (int i = 0; i < num; i++) {
int idx = Integer.parseInt(st.nextToken());
result[idx] = true;
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(bf.readLine());
num = Integer.parseInt(st.nextToken());
for (int j = 0; j < num; j++) {
int idx = Integer.parseInt(st.nextToken());
party.get(i).add(idx);
}
for (int j = 0; j < num; j++) {
for (int k = j + 1; k < num; k++) {
int a = party.get(i).get(j);
int b = party.get(i).get(k);
arr.get(a).add(b);
arr.get(b).add(a);
}
}
}
for (int i = 1; i <= n; i++) {
if (result[i]) {
visited[i] = true;
bfs(i);
}
}
int answer = 0;
for (int i = 0; i < m; i++) {
boolean flag = false;
for (int j = 0; j < party.get(i).size(); j++) {
if (result[party.get(i).get(j)]) {
flag = true;
break;
}
}
if (!flag)
answer += 1;
}
System.out.println(answer);
}
private static void bfs(int idx) {
Queue<Integer> queue = new LinkedList<>();
queue.add(idx);
while (!queue.isEmpty()) {
int num = queue.poll();
for (int i = 0; i < arr.get(num).size(); i++) {
int next = arr.get(num).get(i);
if (!visited[next]) {
visited[next] = true;
result[next] = true;
queue.add(next);
}
}
}
}
}
Main
- ์ฌ๋์ ์ (n), ํํฐ์ ์ (m) ์ ๋ ฅ
- visited: ๋ฐฉ๋ฌธ ์ฌ๋ถ
result: ์ง์ค์ ์๋ ์ฌ๋
arr : ํํฐ์์ ์๋ก ๋ง๋๋ ์ฌ๋๋ค
party: ํํฐ ์ ๋ณด
- ์ง์ค์ ์๋ ์ฌ๋ ์(num) ์ ๋ ฅ
- ์ง์ค์ ์๋ ์ฌ๋ ์๋งํผ ์ฌ๋๋ค์ ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ์ result๋ฅผ true๋ก ์ ์ฅ
- ํํฐ๋ง๋ค ์ค๋ ์ฌ๋์ ์(num) ์ ๋ ฅ
ํํฐ๋ง๋ค ์ค๋ ์ฌ๋์ ์๋งํผ ์ฌ๋๋ค์ ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ์ party ์ ๋ณด ์ ์ฅ ๋ฐ ์ธ์ ๋ฆฌ์คํธ ์ ์ฅ
- ์ง์ค์ ์๋ ์ฌ๋์ ์์์ผ๋ก ํ์ฌ bfs ํจ์ ํธ์ถ
- ํํฐ ์ ๋ณด๋ฅผ ์ ์ฅํด ๋ ๋ฆฌ์คํธ๋ฅผ ํ์ํ์ฌ ๊ฐ ํํฐ์์ ์ง์ค์ ์๋ ์ฌ๋์ด ์๋ค๋ฉด answer +1
- answer ์ถ๋ ฅ
Search
- queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต -> num์ ์ธ์ ๋ฆฌ์คํธ ํ์ํ์ฌ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ์ / ์ง์ค์ ์๋ ์ฌ๋์ผ๋ก ์ ์ฅ / queue์ ์ถ๊ฐ
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 14267_ํ์ฌ ๋ฌธํ 1 (0) | 2023.06.27 |
---|---|
[Baekjoon] 16562_์น๊ตฌ๋น (0) | 2023.06.27 |
[Baekjoon] 12893_์ ์ ์ (0) | 2023.06.26 |
[Baekjoon] 7662_์ด์ค ์ฐ์ ์์ ํ (0) | 2023.06.19 |
[Baekjoon] 19538_๋ฃจ๋จธ (0) | 2023.06.15 |