BOJ 1043: 거짓말

이원희·2021년 2월 17일
0

📝 PS

목록 보기
54/65
post-thumbnail

문제 풀이

파티 인원을 입력 받으면서 파티에 온 사람들끼리 연결(connnect)을 설정한다.
진실을 아는 사람부터 시작해서 dfs로 진실을 퍼트린다.
진실은 한 파티의 모든 사람에게로 퍼져나가기 때문에 파티에 온 사람 한명만 조사해도 알 수 있다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int N, M;
    static boolean[] know;
    static boolean[][] connect;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        know = new boolean[N + 1];
        st = new StringTokenizer(br.readLine());
        int liarCount = Integer.parseInt(st.nextToken());
        if(liarCount == 0) {
            System.out.println(M);
            return;
        }
        for(int i = 0; i < liarCount; i++) {
            know[Integer.parseInt(st.nextToken())] = true;
        }
        connect = new boolean[N + 1][N + 1];
        int[][] party = new int[M][];
        for(int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int partyCount = Integer.parseInt(st.nextToken());
            party[i] = new int[partyCount];
            party[i][0] = Integer.parseInt(st.nextToken());
            for(int j = 1; j < partyCount; j++) {
                party[i][j] = Integer.parseInt(st.nextToken());
                connect[party[i][j - 1]][party[i][j]] = connect[party[i][j]][party[i][j - 1]] = true;
            }
        }
        
        for(int i = 1; i <= N; i++) {
            if (know[i]) {
                dfs(i);
            }
        }
        
        int answer = 0;
        for(int i = 0; i < M; i++) {
            if(!know[party[i][0]]) {
                answer++;
            }
        }
        System.out.println(answer);
    }
    public static void dfs(int n) {
        for(int i = 1; i <= N; i++) {
            if(connect[n][i] && !know[i]) {
                know[i] = true;
                dfs(i);
            }
        }
    }
}

백준
github

0개의 댓글