알고리즘

백준 1043번 거짓말 (JAVA)

박카스마시며코딩 2022. 1. 26. 15:58

https://www.acmicpc.net/problem/1043

 

1043번: 거짓말

지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게

www.acmicpc.net

 

저는 해당 문제를 union find set을 이용하여 문제를 해결하였습니다.

처음 이야기를 아는 사람끼리 그룹으로 묶었습니다.

각각의 파티의 사람들을 한 그룹으로 만들었습니다.

마지막으로 각 파티의 한사람과 처음 이야기를 아는 사람 중 한사람의 그룹을 비교해서 둘의 그룹이 다르다면 파티에서 과장할 수 있기 때문에 결과값을 하나 올려주었습니다. 

 

 

 

package BOJ.ETC;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_1043 {
    static int findSet(int a,int[] parent){
        if(parent[a] == a){
            return a;
        }
        return parent[a] = findSet(parent[a],parent);
    }
    static boolean union(int a, int b,int[] parent){
        int aRoot = findSet(a,parent);
        int bRoot = findSet(b,parent);
        if(aRoot == bRoot){
            return false;
        }
        parent[aRoot] = bRoot;
        return true;
    }
    static boolean findParty(int a, int b,int[] parent){
        int aRoot = findSet(a,parent);
        int bRoot = findSet(b,parent);
        if(aRoot == bRoot){
            return false;
        }
        return true;
    }
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int m = stoi.apply(st.nextToken());
        st = new StringTokenizer(br.readLine());
        int cnt = stoi.apply(st.nextToken());
        int knowNum = 0;
        int[] parent = new int[n+1];
        for(int i = 0 ; i <= n ; i++){
            parent[i] = i;
        }
        for(int i = 0 ; i < cnt ; i++){
            int knowPeople = stoi.apply(st.nextToken());
            parent[knowPeople] = 0;
            knowNum = knowPeople;
        }
        int result = 0;
        int[][] input = new int[m][];
        for(int i = 0 ; i < m ; i++){
            st = new StringTokenizer(br.readLine());
            cnt = stoi.apply(st.nextToken());
            input[i] = new int[cnt];
            for(int j = 0 ; j < cnt; j++){
                input[i][j] = stoi.apply(st.nextToken());
                if(j >= 1){
//                    System.out.println(input[i][0]+" "+input[i][j]);
                    union(input[i][0],input[i][j],parent);
                }
            }
        }
//        System.out.println(Arrays.toString(parent));
        for(int i = 0 ; i < m ; i++){
            if(findParty(knowNum,input[i][0],parent)){
                result++;
            }
        }
        System.out.println(result);
    }

}