[Algorithm] 백준_거짓말_1043번 (JAVA) 유니온 파인드

2025. 3. 25. 23:57·Algorithm

📝문제

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

거짓말: 1043번

티어: 골드 4

💡풀이

문제 유형

유니온파인드

 

걸린 시간

60분

 

시간 복잡도

O(N+M)

 

풀이 방법 도출

1. 이 문제의 키포인트: 진실을 알고있는 사람끼리 묶기

2. hashset에 진실을 알고 있는 사람을 add한다.

3. 같은 파티에 있는 사람들은 모두 같은 집합으로 묶는다. union

4. 진실을 아는 사람의 최상위 부모를 새로운 set에 넣고

5. 파티 별 사람들을 검색해 사람들의 최상위 부모가 set에 포함되어있는지 확인한다.

import java.util.*;
import java.io.*;
class Main{
    static int[] parent;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        parent = new int[N+1];
        for(int i = 0; i <= N; i++){
            parent[i] = i;
        }

        ArrayList<Integer>[] person = new ArrayList[M+1];
        for(int i = 0; i <= M; i++){
            person[i] = new ArrayList<>();
        }

        HashSet<Integer> set = new HashSet<>();
        st = new StringTokenizer(br.readLine());
        int knowTruthPeople = Integer.parseInt(st.nextToken());
        for(int i = 0; i < knowTruthPeople; i++){
            set.add(Integer.parseInt(st.nextToken()));
        }

        for(int i = 1; i <= M; i++){
            st = new StringTokenizer(br.readLine());
            int count = Integer.parseInt(st.nextToken());
            int prev = -1;
            for(int j = 0; j < count; j++){
                int p = Integer.parseInt(st.nextToken());
                person[i].add(p);
                if(prev != -1){
                    union(prev, p);
                }else{
                    prev = p;
                }
            }
        }

        HashSet<Integer> set2 = new HashSet<>();
        for (int p : set) {
            set2.add(find(p));
        }

        int answer = M;

        for(int i = 1; i <= M; i++){
            for(int p : person[i]){
                if(set2.contains(find(p))){
                    answer--;
                    break;
                }
            }
        }

        System.out.println(answer);
    }
    public static int find(int a){
        if(parent[a] == a){
            return a;
        }
        return parent[a] = find(parent[a]);
    }
    public static void union(int a, int b){
        int rootA = find(a);
        int rootB = find(b);

        if(rootA != rootB){
            parent[rootB] = rootA;
        }
    }
}

 

🤔Review

처음에 이 문제를 풀며 이렇게 쉬운 문제가 왜 골드지? 했는데 아니나 다를까 접근방법이 완전히 달랐던 것..

유니온 파인드 아직 낯설지만, 알고리즘 연습 굳,

'Algorithm' 카테고리의 다른 글

[Algorithm] 백준_구간 합 구하기 5_11660번 (JAVA)  (0) 2025.03.27
[Algorithm] 백준_최소비용 구하기 2_11779번 (JAVA)  (0) 2025.03.26
[Algorithm] 백준_최소비용 구하기_1916번 (JAVA) 다익스트라  (0) 2025.03.24
[Algorithm] 백준_DNA 비밀번호_12891번 (JAVA) 슬라이딩 윈도우  (0) 2025.03.23
[Algorithm] 백준_평범한 배낭_12865번 (JAVA) 🎒  (0) 2025.03.23
'Algorithm' 카테고리의 다른 글
  • [Algorithm] 백준_구간 합 구하기 5_11660번 (JAVA)
  • [Algorithm] 백준_최소비용 구하기 2_11779번 (JAVA)
  • [Algorithm] 백준_최소비용 구하기_1916번 (JAVA) 다익스트라
  • [Algorithm] 백준_DNA 비밀번호_12891번 (JAVA) 슬라이딩 윈도우
dev_ajrqkq
dev_ajrqkq
알고리즘 천재가 될 거야
  • dev_ajrqkq
    기록이 자산이다
    dev_ajrqkq
  • 전체
    오늘
    어제
    • 분류 전체보기 (147)
      • Front-end (0)
      • Back-end (11)
        • Spring (1)
        • Java (8)
      • CS (9)
        • 데이터베이스 (5)
        • 네트워크 (4)
      • Algorithm (80)
      • 이것저것 (0)
      • 버그잡기 (1)
      • TIL (37)
      • 후기 (1)
      • 취준 (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Til
      항해99
      TypeScript
      오블완
      개발자취업
      코딩테스트준비
      99클럽
      티스토리챌린지
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    dev_ajrqkq
    [Algorithm] 백준_거짓말_1043번 (JAVA) 유니온 파인드
    상단으로

    티스토리툴바