CodingTest/Java
BOJ_1043 : κ±°μ§λ§
Soom_1n
2023. 6. 9. 20:39
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