-
728x90
그래프 이론 중 Union & Find 개념을 알고 있다면 쉽게 접근할 수 있는 문제다. 합집합 연산에서는 Union, 같은 집합에 포함되어 있는지 확인 연산은 Find로 확인할 수 있다.
기본적으로 단일 Union&Find 연산에서 시간 복잡도는 O(N)인데, 그런 연산이 이 문제에서는 M번 주어지므로, 단순하게 Union & Find를 구현하게 되면 시간초과를 볼 수 있는데, 경로압축기법을 사용해 시간복잡도를 대폭 단축시키면 대략 O(M)번의 연산으로 이 문제를 해결할 수 있다.
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static int N, M; static int[] parents; public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); parents = new int[N+1]; for(int i = 0; i <= N; i++) { parents[i] = i; } for(int i = 0; i < M; i++) { st = new StringTokenizer(br.readLine()); int func = Integer.parseInt(st.nextToken()); int n1 = Integer.parseInt(st.nextToken()); int n2 = Integer.parseInt(st.nextToken()); if(func == 0) { parentUnion(n1, n2); }else { if(parentFind(n1) == parentFind(n2)) { System.out.println("YES"); } else { System.out.println("NO"); } } } } private static int parentFind(int a) { if(parents[a] != a) { parents[a] = parentFind(parents[a]); } return parents[a]; } private static void parentUnion(int a, int b) { a = parentFind(a); b = parentFind(b); if(a < b) { parents[b] = a; }else { parents[a] = b; } } }
'Algorithms' 카테고리의 다른 글
[BOJ] 1753 최단경로 Java 풀이 (0) 2021.03.04 [BOJ] 11266 단절점 Java 풀이 (0) 2021.03.04 [BOJ] 2143 두 배열의 합 Java 풀이 (0) 2021.02.12 [BOJ] 2632 피자판매 Java 풀이 (0) 2021.02.12 [BOJ] 7453 합이 0인 네 정수 Java 풀이 (0) 2021.02.12 댓글