코딩테스트/BOJ

[BOJ] 1717 집합의 표현 - JAVA

5월._. 2022. 3. 31.
728x90

1. 문제

 

1717번: 집합의 표현

첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는

www.acmicpc.net

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

집합을 표현하는 프로그램을 작성하시오.


2. 풀이

메인

static int[] sets;
static int N,M;
public static void main(String[] args) throws IOException {
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   StringBuilder sb = new StringBuilder();
   StringTokenizer st = new StringTokenizer(in.readLine());
   N = Integer.parseInt(st.nextToken());
   M = Integer.parseInt(st.nextToken());

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

   for(int i=0;i<M;i++){
      st = new StringTokenizer(in.readLine());
      switch(st.nextToken().charAt(0)){
         case '0':
            union(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()));
            break;
         case '1':
            if(find(Integer.parseInt(st.nextToken()))==find(Integer.parseInt(st.nextToken()))) sb.append("YES\n");
            else sb.append("NO\n");
            break;
      }
   }

   System.out.print(sb);
}

Union

private static void union(int a, int b) {
   int pa = find(a);
   int pb = find(b);
   if(pa!=pb) sets[pa] = pb;
}

Find

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

3. 결과

지금까지의 지식으로는 이해할 수 없는 결과가 나왔다. main 밖에 static을 쓰면 전역+정적변수라서 저장위치때문에 지역변수보다 접근시간에서 더 불리하다고 생각했다. 

사진상의 노란색, 파란색끼리 같은 코드인데 n,m을 staic으로 밖에 빼고 안빼고에 따라 시간차이가 저렇게 많이 난다. 

이 부분에서는 왜 그런지 좀 더 공부가 필요할 것 같다.

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

[BOJ] 9020 골드바흐의 추측 - JAVA  (0) 2022.04.01
[BOJ] 1976 여행 가자 - JAVA  (0) 2022.04.01
[BOJ] 11052 카드 구매하기 - JAVA  (0) 2022.03.30
[BOJ] 1002 터렛 - JAVA  (0) 2022.03.28
[BOJ] 11724 연결요소의 개수 - JAVA  (0) 2022.03.27

댓글