반응형
Notice
Recent Posts
Recent Comments
Link
It's easy, if you try
[백준/boj] 1043: 거짓말 (Java) / Union-Find 본문
반응형
문제
풀이
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int N, M, total = 0;
static boolean[] truePeople = new boolean[51];
static int[] parent;
public static void main(String[] args) throws Exception {
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 사람 수
M = Integer.parseInt(st.nextToken()); // 파티 수
// 1. union-find 초기화
parent = new int[N+1];
for(int i=1;i<=N; i++) {
parent[i] = i;
}
// 2. 진실을 아는 사람 정보 받아오기 truePeople[진실을아는사람] == true
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
for(int i=0; i<n; i++) {
truePeople[Integer.parseInt(st.nextToken())] = true;
}
// 3. 파티 정보를 받아오면서 같은 파티에 있는 사람들 union
ArrayList<Integer>[] peoples = new ArrayList[M];
for(int i=0; i<M; i++) {
peoples[i] = new ArrayList<>();
}
int value, pre =0;
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
if(n > 0) {
pre = Integer.parseInt(st.nextToken());
peoples[i].add(pre);
}
for(int j=1; j<n; j++) {
value = Integer.parseInt(st.nextToken());
peoples[i].add(value);
union(pre, value); // 두명씩 union하면 모두가 같은 parent를 갖게 됨.
pre = value;
}
}
// 4. 진실을 아는 사람들의 parent는 같이 파티를 참여 했으므로 진실을 아는 사람들
int parent;
for(int i=1; i<truePeople.length; i++) {
if(truePeople[i]) {
truePeople[find(i)] = true;
}
}
// 5. 진실을 아는 사람들과 파티를 같이 하지 않았으면 total++
for(int i=0; i<M; i++) {
if(peoples[i].size() > 0) {
parent = find(peoples[i].get(0));
if(!truePeople[parent]) total++;
}
}
// 6. 거짓말 할 수 있는 파티 최대 수 출력
System.out.println(total);
}
private static int find(int x) {
if(parent[x] == x)
return parent[x] = x;
else return find(parent[x]);
}
private static boolean union(int a, int b) {
a = find(a);
b = find(b);
if(a!= b) {
if(a>b) {
parent[a] = b;
} else {
parent[b] = a;
}
return true;
}
return false;
}
}
반응형
'알고리즘 > 자바(Java)' 카테고리의 다른 글
[백준/boj] 1520: 내리막 길 / BFS / Priority Queue / DP (2) | 2021.04.06 |
---|---|
[백준/boj] 2573: 빙산 (Java) / BFS / 구현 (0) | 2021.04.05 |
[백준/boj] 2620: 양팔저울 (Java) / DP / 배낭 문제 (0) | 2021.04.02 |
[백준/boj] 1755: 숫자 놀이 (Java) / 문자열 / HashMap (0) | 2021.03.30 |
[백준/boj] 14923: 미로 탈출 (Java) / BFS / 3차원 배열 (0) | 2021.03.29 |
Comments