Skip to content

Commit ff37a21

Browse files
committedJun 12, 2024
Merge branch 'week8'
2 parents dd61ef7 + 7b3c461 commit ff37a21

7 files changed

+422
-0
lines changed
 

‎week8/BOJ_1043(거짓말).java

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
public static int[] parent;
6+
7+
public static void main(String[] args) throws IOException {
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
StringTokenizer st = new StringTokenizer(br.readLine());
10+
int N = Integer.parseInt(st.nextToken());
11+
int M = Integer.parseInt(st.nextToken());
12+
parent = new int[N+1];
13+
for(int i=1; i<=N; i++) {
14+
parent[i] = i;
15+
}
16+
st = new StringTokenizer(br.readLine());
17+
int truthNum = Integer.parseInt(st.nextToken());
18+
boolean[] truth = new boolean[N+1];
19+
for(int i=0; i<truthNum; i++) {
20+
int truthIndex = Integer.parseInt(st.nextToken());
21+
truth[truthIndex] = true;
22+
}
23+
List<List<Integer>> attendee = new ArrayList<>();
24+
for(int i=0; i<=M; i++) {
25+
attendee.add(new ArrayList<>());
26+
}
27+
for(int i=1; i<=M; i++) {
28+
st = new StringTokenizer(br.readLine());
29+
int num = Integer.parseInt(st.nextToken());
30+
for(int j=1; j<=num; j++) {
31+
int attendeeIndex = Integer.parseInt(st.nextToken());
32+
attendee.get(i).add(attendeeIndex);
33+
union(attendee.get(i).get(0), attendeeIndex);
34+
}
35+
}
36+
// 진실을 아는 사람의 parent 도 진실을 알도록 업데이트
37+
for(int i=1; i<=N; i++) {
38+
if(truth[i]) {
39+
truth[find(i)] = true;
40+
}
41+
}
42+
43+
int answer = M;
44+
for(int i=1; i<=M; i++) {
45+
// 파티 참석자의 부모 노드가 진실을 아는 사람이면 거짓말 할 수 없음
46+
for(int j=0; j<attendee.get(i).size(); j++) {
47+
int attendeeParent = find(attendee.get(i).get(j));
48+
if(truth[attendeeParent]) {
49+
answer--;
50+
break;
51+
}
52+
}
53+
}
54+
System.out.println(answer);
55+
}
56+
57+
public static int find(int x) {
58+
if(parent[x] == x) {
59+
return x;
60+
}
61+
parent[x] = find(parent[x]);
62+
return parent[x];
63+
}
64+
public static void union(int x, int y) {
65+
x = find(x);
66+
y = find(y);
67+
if(x == y) {
68+
return;
69+
}
70+
parent[y] = x;
71+
}
72+
}

‎week8/BOJ_16398(행성 연결).java

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
public static int[] parent;
7+
8+
public static void main(String[] args) throws IOException {
9+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
10+
int N = Integer.parseInt(br.readLine());
11+
parent = new int[N];
12+
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> Integer.compare(o1[2], o2[2]));
13+
for(int i=0; i<N; i++) {
14+
parent[i] = i;
15+
StringTokenizer st = new StringTokenizer(br.readLine());
16+
for(int j=0; j<N; j++) {
17+
int cost = Integer.parseInt(st.nextToken());
18+
if(i < j) {
19+
pq.add(new int[]{i, j, cost});
20+
}
21+
}
22+
}
23+
24+
long minCost = 0;
25+
while(!pq.isEmpty()) {
26+
int[] edge = pq.poll();
27+
int v1 = edge[0];
28+
int v2 = edge[1];
29+
int cost = edge[2];
30+
31+
if(union(v1, v2)) {
32+
minCost += cost;
33+
}
34+
}
35+
System.out.println(minCost);
36+
}
37+
38+
public static int find(int x) {
39+
if(parent[x] == x) {
40+
return x;
41+
}
42+
parent[x] = find(parent[x]);
43+
return parent[x];
44+
}
45+
46+
public static boolean union(int x, int y) {
47+
x = find(x);
48+
y = find(y);
49+
if(x == y) {
50+
return false;
51+
}
52+
parent[y] = x;
53+
return true;
54+
}
55+
}
+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
public static int[] parent;
6+
7+
public static void main(String[] args) throws IOException {
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
StringTokenizer st = new StringTokenizer(br.readLine());
10+
int N = Integer.parseInt(st.nextToken());
11+
int M = Integer.parseInt(st.nextToken());
12+
parent = new int[N+1];
13+
for(int i=1; i<=N; i++) {
14+
parent[i] = i;
15+
}
16+
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> Integer.compare(o1[2], o2[2]));
17+
for(int i=0; i<M; i++) {
18+
st = new StringTokenizer(br.readLine());
19+
int A = Integer.parseInt(st.nextToken());
20+
int B = Integer.parseInt(st.nextToken());
21+
int C = Integer.parseInt(st.nextToken());
22+
pq.offer(new int[]{A, B, C});
23+
}
24+
long totalCost = 0;
25+
int maxCost = 0;
26+
while(!pq.isEmpty()) {
27+
int[] edge = pq.poll();
28+
int v1 = edge[0];
29+
int v2 = edge[1];
30+
int cost = edge[2];
31+
32+
// 사이클이 없으면 연결 후 비용 더하기
33+
if(union(v1, v2)) {
34+
totalCost += cost;
35+
maxCost = cost;
36+
}
37+
}
38+
System.out.println(totalCost - maxCost);
39+
}
40+
41+
public static int find(int x) {
42+
if(parent[x] == x) {
43+
return x;
44+
}
45+
parent[x] = find(parent[x]);
46+
return parent[x];
47+
}
48+
49+
public static boolean union(int x, int y) {
50+
x = find(x);
51+
y = find(y);
52+
if(x == y) {
53+
return false;
54+
}
55+
parent[y] = x;
56+
return true;
57+
}
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
public static int[] parent;
6+
public static int[] count;
7+
8+
public static void main(String[] args) throws IOException {
9+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
10+
StringTokenizer st = new StringTokenizer(br.readLine());
11+
int N = Integer.parseInt(st.nextToken());
12+
int M = Integer.parseInt(st.nextToken());
13+
parent = new int[N+1];
14+
count = new int[N+1];
15+
for(int i=0; i<N; i++) {
16+
parent[i] = i;
17+
count[i] = 1;
18+
}
19+
for(int i=0; i<M; i++) {
20+
st = new StringTokenizer(br.readLine());
21+
int tutor = Integer.parseInt(st.nextToken());
22+
int tutee = Integer.parseInt(st.nextToken());
23+
union(tutor, tutee);
24+
}
25+
long answer = 1;
26+
for(int i=0; i<N; i++) {
27+
answer = (answer * count[i]) % 1000000007;
28+
}
29+
System.out.println(answer);
30+
}
31+
32+
public static int find(int x) {
33+
if(parent[x] == x) {
34+
return x;
35+
}
36+
parent[x] = find(parent[x]);
37+
return parent[x];
38+
}
39+
public static void union(int x, int y) {
40+
x = find(x);
41+
y = find(y);
42+
if(x == y) {
43+
return;
44+
}
45+
count[x] += count[y];
46+
count[y] = 1;
47+
parent[y] = x;
48+
}
49+
}
+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
public static Map<String, Integer> friendIndex;
7+
public static int[] parent;
8+
public static int[] count;
9+
10+
public static void main(String[] args) throws IOException {
11+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
12+
int T = Integer.parseInt(br.readLine());
13+
StringBuilder sb = new StringBuilder();
14+
for(int t=0; t<T; t++) {
15+
int F = Integer.parseInt(br.readLine());
16+
friendIndex = new HashMap<>();
17+
count = new int[F*2];
18+
parent = new int[F*2];
19+
for(int i=1; i<F*2; i++) {
20+
parent[i] = i;
21+
}
22+
int num = 0;
23+
for(int i=0; i<F; i++) {
24+
StringTokenizer st = new StringTokenizer(br.readLine());
25+
String friend1 = st.nextToken();
26+
String friend2 = st.nextToken();
27+
if(!friendIndex.containsKey(friend1)) {
28+
count[num] = 1;
29+
friendIndex.put(friend1, num++);
30+
}
31+
if(!friendIndex.containsKey(friend2)) {
32+
count[num] = 1;
33+
friendIndex.put(friend2, num++);
34+
}
35+
int x = find(friendIndex.get(friend1));
36+
int y = find(friendIndex.get(friend2));
37+
union(x, y);
38+
sb.append(count[x]).append('\n');
39+
}
40+
}
41+
System.out.print(sb);
42+
}
43+
44+
public static int find(int x) {
45+
if(parent[x] == x) {
46+
return x;
47+
}
48+
parent[x] = find(parent[x]);
49+
return parent[x];
50+
}
51+
public static void union(int x, int y) {
52+
x = find(x);
53+
y = find(y);
54+
if(x == y) {
55+
return;
56+
}
57+
parent[y] = x;
58+
count[x] += count[y];
59+
}
60+
}

‎week8/BOJ_5107(마니또).java

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
public static Map<String, Integer> manitoIndex;
7+
public static int[] parent;
8+
9+
public static void main(String[] args) throws IOException {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
StringBuilder sb = new StringBuilder();
12+
int t = 1;
13+
while(true) {
14+
int N = Integer.parseInt(br.readLine());
15+
if(N == 0) {
16+
System.out.print(sb);
17+
return;
18+
}
19+
manitoIndex = new HashMap<>();
20+
parent = new int[N+1];
21+
for(int i=1; i<=N; i++) {
22+
parent[i] = i;
23+
}
24+
int num = 0;
25+
Set<Integer> set = new HashSet<>();
26+
for(int i=0; i<N; i++) {
27+
StringTokenizer st = new StringTokenizer(br.readLine());
28+
String manito1 = st.nextToken();
29+
String manito2 = st.nextToken();
30+
if(!manitoIndex.containsKey(manito1)) {
31+
manitoIndex.put(manito1, num++);
32+
}
33+
if(!manitoIndex.containsKey(manito2)) {
34+
manitoIndex.put(manito2, num++);
35+
}
36+
int x = find(parent[manitoIndex.get(manito1)]);
37+
int y = find(parent[manitoIndex.get(manito2)]);
38+
union(x, y);
39+
}
40+
for(int i=1; i<=N; i++) {
41+
if(i != parent[i]) {
42+
set.add(parent[i]);
43+
}
44+
}
45+
sb.append(t++).append(' ').append(set.size()).append('\n');
46+
}
47+
}
48+
49+
public static int find(int x) {
50+
if(parent[x] == x) {
51+
return x;
52+
}
53+
parent[x] = find(parent[x]);
54+
return parent[x];
55+
}
56+
public static void union(int x, int y) {
57+
x = find(x);
58+
y = find(y);
59+
if(x == y) {
60+
return;
61+
}
62+
parent[y] = x;
63+
}
64+
}

0 commit comments

Comments
 (0)
Please sign in to comment.