Algorithm

[Algorithm] 팀 결성

씬프 2021. 5. 27. 13:31
반응형

문제

학교에서 학생들에게 0번부터 N번까지 번호를 부여했다. 처음에는 모든 학생이 서로 다른 팀으로 구분되어 총 N+1개의 팀이 존재한다. 이때 선생님은 '팀 합치기' 연산과 '같은 팀 여부 확인' 연산을 사용할 수 있다.

 

1. 팀 합치기 연산은 두 팀을 합치는 연산이다.

2. 같은 팀 여부 확인 연산은 특정한 두 학생이 같은 팀에 속하는지를 확인하는 연산이다.

 

선생님이 M개의 연산을 수행할 수 있을 때, 같은 팀 여부 확인 연산에 대한 연산 결과를 출력하는 프로그램을 작성하시오.

 

입력조건

첫째줄에 N, M이 주어진다.

둘째줄부터 M+1번째 줄까지 각각의 연산이 주어진다.

팀 합치기 연산은 0 a b 형태로 주어진다.

같은 팀 여부 확인 연산은 1 a b 형태로 주어진다.

 

출력 조건

같은 팀 여부 확인 연산에 대해 한줄에 하나씩 YES 혹은 NO를 출력한다.

 

풀이

팀을 합치고, 팀인지 확인하는 서로소 집합 자료구조를 활용한 문제다.

집합을 합치는 연산과 집합을 확인하는 연산을 구현한다.

import java.util.*;

class Main {

  public static int n, m;
  // 팀 번호
  public static int[] team = new int[100001];
  // 결과 저장
  public static List<String> result = new ArrayList<>();

  // 팀 합치기
  public static void unionTeam (int a, int b) {
    a = findTeam(a);
    b = findTeam(b);
    if (a < b) team[b] = a;
    else team[a] = b;
  }

  // 같은 팀 여부 확인
  public static int findTeam (int x) {
    if (team[x] == x) return x;
    return team[x] = findTeam(team[x]);
  }

  public static void main(String[] args) {
    
    Scanner sc = new Scanner(System.in);
    n = sc.nextInt();
    m = sc.nextInt();

    for (int i = 0; i <= n; i++) {
      team[i] = i;
    }

    for (int i = 0; i < m; i++) {
      int f = sc.nextInt();
      int a = sc.nextInt();
      int b = sc.nextInt();
      if (f == 0) {
        // 합치기
        unionTeam(a, b);
      } else {
        // 확인
        result.add((findTeam(a) == findTeam(b)) ? "YES" : "NO");
      }
    }

    for (String r : result) {
      System.out.print(r + " ");
    }
    

  } // end main
}

'Algorithm' 카테고리의 다른 글

[Algorithm] 커리큘럼  (0) 2021.05.29
[Algorithm] 도시 분할 계획  (0) 2021.05.28
[Algorithm] 서로소 집합 자료구조  (0) 2021.05.26
[Algorithm] 전보  (0) 2021.05.25
[Algorithm] 미래 도시  (0) 2021.05.22