1043. 거짓말 (Java)

2023. 11. 15. 14:11·Algorithm & Data Structures/BOJ

UnionFind를 이용하여 문제를 풀었다.

1. 파티멤버를 확인하면서 union해주고

2. 파티멤버를 돌면서 find 해준다음 진실을 아는사람과 엮여있다면 모두 진실체크

3. 파티멤버를 돌면서 진실을 모르는 파티가 있다면 answer ++;

4. answer 출력 하였다.

package algorithm.src.minho;

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

public class Main {

    static ArrayList<Integer>[] party;
    static int N,M;
    static int[] parent;
    static boolean[] know;
    static int find(int x){
        if(parent[x] == x)
            return x;
        parent[x]=find(parent[x]);
        return parent[x]=find(parent[x]);
    }
    static void union(int x, int y){
        x = find(x);
        y = find(y);
        if(x==y) return;
        parent[y]=x;
    }
    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());

        parent = new int[N+1];
        know = new boolean[N+1];
        boolean[] isVisited = new boolean[N+1];
        party = new ArrayList[M];
        st = new StringTokenizer(br.readLine());
        int know_people = Integer.parseInt(st.nextToken());

        for(int i = 0 ; i < know_people; i++){
            int peo = Integer.parseInt(st.nextToken());
            know[peo] = true;
        }
        for(int i = 0 ; i < N+1;i++)
            parent[i]=i;

        for(int i = 0 ; i < M ; i++){
            st = new StringTokenizer(br.readLine());
            party[i] = new ArrayList<>();
            int partypeople = Integer.parseInt(st.nextToken());
            for(int j = 0 ; j < partypeople ; j++){
                party[i].add(Integer.parseInt(st.nextToken()));
            }
            int size = party[i].size();
            for(int j = 0 ; j < size-1 ; j++){
                int a = party[i].get(j);
                int b = party[i].get(j+1);
                if(find(a)!=find(b))
                    union(a,b);
            }
        }

        for(int i = 1 ; i <= N ; i++){
            if(know[i] && !isVisited[i]){
                int root = find(i);
                for(int j = 1 ; j <= N ; j++){
                    if(find(j)==root){
                        know[j] = true;
                        isVisited[j] = true;
                    }
                }
            }
        }

        int answer = 0 ;
        for(int i = 0 ; i < M ; i++){
            boolean flag = false;
            for (int person : party[i]){
                if(know[person]) {
                    flag = true;
                    break;
                }
            }
            if(!flag) answer++;
        }
        System.out.println(answer);
    }
}

'Algorithm & Data Structures > BOJ' 카테고리의 다른 글

14938. 서강그라운드 (Java)  (1) 2023.11.29
12851. 숨바꼭질2 (Java)  (2) 2023.11.28
2638. 치즈 (Java)  (0) 2023.11.14
1167. 트리의 지름 (Java)  (1) 2023.11.13
11725. 트리의 부모 찾기 (Java)  (0) 2023.11.12
'Algorithm & Data Structures/BOJ' 카테고리의 다른 글
  • 14938. 서강그라운드 (Java)
  • 12851. 숨바꼭질2 (Java)
  • 2638. 치즈 (Java)
  • 1167. 트리의 지름 (Java)
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (315) N
      • Algorithm & Data Structures (237) N
        • BOJ (95) N
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (25)
        • SQL (19)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    unionfind
    백트래킹
    Dijkstra
    구현
    후위순회
    유니온파인드
    SQL
    프로그래머스
    골드
    Union-Find
    경로압축
    백준
    dfs
    algorithm
    투포인터
    BFS
    알고리즘
    전위순회
    binarySearch
    이분탐색
    PriorityQueue
    스택
    동적계획법
    baekjoon
    다익스트라
    programmers
    Stack
    dp
    DynamicProgramming
    Java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
1043. 거짓말 (Java)
상단으로

티스토리툴바