SW 공부노트

[백준/자바] 1717 : 집합의 표현 본문

백준풀이

[백준/자바] 1717 : 집합의 표현

요빈 2023. 6. 18. 23:51

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

 

1717번: 집합의 표현

초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작

www.acmicpc.net


Union Find의 기초문제이다.

이 문제를 통해 처음으로 Union Find 알고리즘을 공부하였다.

예시 코드가 자바는 아니지만 다음 글이 큰 도움이 되었다 👍

https://4legs-study.tistory.com/94

 

분리 집합 (Disjoint Set) : Union-Find

서론 다음과 같은 메신저 프로그램이 있다. "A와 B가 친구 관계이고, 내가 A와 친구 관계이면 자동으로 나와 B는 친구 관계가 된다." 이 메신저 프로그램을 통해 내가 A라는 사람과 친구 관계를 맺

4legs-study.tistory.com

 

풀이과정은 다음과 같다.

 

  • 입력이 0으로 시작하면 union을 통해 두 집합 합치기
  • 입력이 1으로 시작하면 find를 통해 최상위 노드값이 같은지 확인하기
public class Main {

   public static int[] set;

   public static void main(String[] args) throws IOException {
       // TODO Auto-generated method stub
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       StringTokenizer st = new StringTokenizer(br.readLine());
       StringBuilder sb = new StringBuilder();

       int N = Integer.parseInt(st.nextToken());
       int M = Integer.parseInt(st.nextToken());
       set = new int[N + 1];
      for (int i = 0; i <= N; i++) {
           set[i] = i;
       }

       for (int i = 0; i < M; i++) {
           st = new StringTokenizer(br.readLine());
           int cmd = Integer.parseInt(st.nextToken());
           int a = Integer.parseInt(st.nextToken());
           int b = Integer.parseInt(st.nextToken());

           if (cmd == 0) {
               union(a, b);
           } else {
               sb.append(find(a) == find(b) ? "yes" : "no").append("\n");
           }
       }
       System.out.println(sb);
   }

   public static int find(int x) {
       if (set[x] == x)
           return x;
       return set[x] = find(set[x]);
   }

   public static void union(int x, int y) {
       x = find(x);
       y = find(y);
       if (x != y) {
          if (x > y)
               set[y] = x;
           else
               set[x] = y;
       }
   }
}

특히, find 함수에서 set[x] = find(set[x]) 부분과 union에서 x,y의 대소 비교 하는 부분은

연산을 더 효율적으로 하기 위해(최적화) 추가된 부분이다.