Skip to content

Commit 6dbb7c0

Browse files
authored
[20250712] BOJ / G4 / 거짓말 / 신동윤
1 parent b69ce3b commit 6dbb7c0

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
```java
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class Main {
6+
7+
static int N, M;
8+
static boolean[] knowingTruth;
9+
static int[] parents;
10+
11+
12+
public static void main(String[] args) throws IOException {
13+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
StringTokenizer st = new StringTokenizer(br.readLine());
15+
N = Integer.parseInt(st.nextToken());
16+
M = Integer.parseInt(st.nextToken());
17+
18+
knowingTruth = new boolean[N+1];
19+
Arrays.fill(knowingTruth, false);
20+
st = new StringTokenizer(br.readLine());
21+
int knowing = Integer.parseInt(st.nextToken());
22+
for (int i = 0; i < knowing; i++) {
23+
int id = Integer.parseInt(st.nextToken());
24+
knowingTruth[id] = true;
25+
}
26+
27+
initParents();
28+
List<Integer>[] logs = new List[M];
29+
for (int i = 0; i < M; i++) {
30+
logs[i] = new ArrayList<>();
31+
st = new StringTokenizer(br.readLine());
32+
int count = Integer.parseInt(st.nextToken());
33+
int[] arr = new int[count];
34+
for (int j = 0; j < count; j++) {
35+
arr[j] = Integer.parseInt(st.nextToken());
36+
logs[i].add(arr[j]);
37+
}
38+
for (int j = 0; j < count - 1; j++) {
39+
for (int k = j + 1; k < count; k++) {
40+
union(arr[j], arr[k]);
41+
}
42+
}
43+
}
44+
45+
// 거짓말을 할 수 있는 파티인지 판별
46+
int answer = 0;
47+
for (int i = 0; i < M; i++) {
48+
boolean canLie = true;
49+
for (int participant : logs[i]) {
50+
if (knowingTruth[find(participant)]) {
51+
canLie = false;
52+
break;
53+
}
54+
}
55+
if (canLie) answer++;
56+
}
57+
58+
System.out.println(answer);
59+
60+
61+
br.close();
62+
}
63+
64+
private static void initParents() {
65+
parents = new int[N+1];
66+
for (int i = 1 ; i < N+1; i++) {
67+
parents[i] = i;
68+
}
69+
}
70+
71+
private static int find(int x) {
72+
if (x == parents[x]) return x;
73+
return parents[x] = find(parents[x]);
74+
}
75+
76+
private static boolean union(int a, int b) {
77+
int rootA = find(a);
78+
int rootB = find(b);
79+
80+
if (rootA == rootB) return false;
81+
82+
boolean aKnows = knowingTruth[rootA];
83+
boolean bKnows = knowingTruth[rootB];
84+
85+
if (rootA < rootB) {
86+
parents[rootB] = rootA;
87+
} else {
88+
parents[rootA] = rootB;
89+
}
90+
knowingTruth[rootA] = knowingTruth[rootB] = aKnows || bKnows;
91+
return true;
92+
}
93+
}
94+
```

0 commit comments

Comments
 (0)