코딩테스트/SWEA

[SWEA] 3289 서로소집합 - JAVA

5월._. 2022. 2. 23.
728x90

1. 문제

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

초기에 {1}, {2}, ... {n} 이 각각 n개의 집합을 이루고 있다.
여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.

합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다.
두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다.
a와 b는 n 이하의 자연수이며 같을 수도 있다.


2. 풀이

import java.io.*;
import java .util.*;

public class D4_3289_서로소집합 {
   static int[] sets, size;
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      int T = Integer.parseInt(in.readLine());

      StringBuilder sb = new StringBuilder();

      for(int tc=1;tc<=T;tc++){
         sb.append("#").append(tc).append(" ");

         StringTokenizer st = new StringTokenizer(in.readLine());
         int N = Integer.parseInt(st.nextToken());
         int M = Integer.parseInt(st.nextToken());

         size = new int[N+1];
         sets = new int[N+1];
         for(int i=1;i<=N;i++) sets[i] = i;


         for(int m=0;m<M;m++){

            st = new StringTokenizer(in.readLine());

            int operator = Integer.parseInt(st.nextToken());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            switch(operator){
               case 0://합집합
                  union(a,b);
                  break;
               case 1://같은집합인지 확인
                  if(find(a)==find(b)) sb.append(1);
                  else sb.append(0);
                  break;
            }
         }
         sb.append("\n");
      }
      System.out.print(sb);
   }

   private static int find(int x){
      if(sets[x]==x) return x;
      sets[x] = find(sets[x]);
      return sets[x];
   }

   private static void union(int a, int b){
      int pa = find(a);
      int pb = find(b);

      if(pa==pb) return;

      if(size[pa]>size[pb]) sets[pb] = pa;
      else if(size[pa]==size[pb]) size[pb]++;

      if(size[pb]>size[pa]) sets[pa] = pb;

   }
}

3. 결과

'코딩테스트 > SWEA' 카테고리의 다른 글

[SWEA] 1251 하나로 - JAVA  (0) 2022.03.01
[SWEA] 7465 창용 마을 무리의 개수 - JAVA  (0) 2022.02.23
[SWEA] 1238 Contact - JAVA  (0) 2022.02.22
[SWEA] 1247 최적경로 - JAVA  (0) 2022.02.20
[SWEA] 3234 준환이의 양팔저울  (0) 2022.02.20

댓글