Skip to content

Commit 8532579

Browse files
authored
[20251019] BOJ / G1 / 굉장한 모비스터디 / 한종욱
1 parent 78911c6 commit 8532579

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
```
2+
import java.io.*;
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Set;
10+
import java.util.StringTokenizer;
11+
12+
public class Main {
13+
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
14+
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
15+
private static Map<Integer, Set<Integer>> map;
16+
private static List<List<Integer>> temp;
17+
private static int[][] uf, size;
18+
private static int N, M1, M2, M3;
19+
20+
public static void main(String[] args) throws IOException {
21+
init();
22+
findAmazedMobi();
23+
24+
bw.write(temp.size() + "\n");
25+
for (List<Integer> group : temp) {
26+
for (int i = 0; i < group.size(); i++) {
27+
if (i > 0) bw.write(" ");
28+
bw.write(group.get(i) + "");
29+
}
30+
bw.write("\n");
31+
}
32+
bw.flush();
33+
bw.close();
34+
br.close();
35+
}
36+
37+
private static void init() throws IOException {
38+
N = Integer.parseInt(br.readLine());
39+
StringTokenizer st = new StringTokenizer(br.readLine());
40+
M1 = Integer.parseInt(st.nextToken());
41+
M2 = Integer.parseInt(st.nextToken());
42+
M3 = Integer.parseInt(st.nextToken());
43+
44+
uf = new int[3][N+1];
45+
size = new int[3][N+1];
46+
map = new HashMap<>();
47+
temp = new ArrayList<>();
48+
49+
for (int i = 0; i < 3; i++) {
50+
for (int j = 1; j <= N; j++) {
51+
uf[i][j] = j;
52+
size[i][j] = 1;
53+
}
54+
}
55+
56+
for (int i = 0; i < M1; i++) {
57+
st = new StringTokenizer(br.readLine());
58+
int a = Integer.parseInt(st.nextToken());
59+
int b = Integer.parseInt(st.nextToken());
60+
61+
union(a, b, 0);
62+
}
63+
64+
for (int i = 0; i < M2; i++) {
65+
st = new StringTokenizer(br.readLine());
66+
int a = Integer.parseInt(st.nextToken());
67+
int b = Integer.parseInt(st.nextToken());
68+
69+
union(a, b, 1);
70+
}
71+
72+
for (int i = 0; i < M3; i++) {
73+
st = new StringTokenizer(br.readLine());
74+
int a = Integer.parseInt(st.nextToken());
75+
int b = Integer.parseInt(st.nextToken());
76+
77+
union(a, b, 2);
78+
}
79+
}
80+
81+
private static void findAmazedMobi() {
82+
Map<String, List<Integer>> groups = new HashMap<>();
83+
84+
for (int node = 1; node <= N; node++) {
85+
String key = find(node, 0) + "," + find(node, 1) + "," + find(node, 2);
86+
87+
groups.putIfAbsent(key, new ArrayList<>());
88+
groups.get(key).add(node);
89+
}
90+
91+
for (List<Integer> group : groups.values()) {
92+
if (group.size() >= 2) {
93+
Collections.sort(group);
94+
temp.add(group);
95+
}
96+
}
97+
98+
temp.sort((a, b) -> Integer.compare(a.get(0), b.get(0)));
99+
}
100+
101+
private static void union(int x, int y, int index) {
102+
int X = find(x, index);
103+
int Y = find(y, index);
104+
105+
if (size[index][X] < size[index][Y]) {
106+
uf[index][X] = Y;
107+
size[index][Y] += size[index][X];
108+
} else {
109+
uf[index][Y] = X;
110+
size[index][X] += size[index][Y];
111+
}
112+
}
113+
114+
private static int find(int x, int index) {
115+
if (uf[index][x] == x) return x;
116+
117+
return uf[index][x] = find(uf[index][x], index);
118+
}
119+
}
120+
```

0 commit comments

Comments
 (0)