728x90
백준 1717 집합의 표현
문제
초기에 {0}, {1}, {2}, ... {n} 이 각각 n+1개의 집합을 이루고 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
입력
첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미이다. 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력이 주어진다. 이는 a와 b가 같은 집합에 포함되어 있는지를 확인하는 연산이다. a와 b는 n 이하의 자연수 또는 0이며 같을 수도 있다.
출력
1로 시작하는 입력에 대해서 한 줄에 하나씩 YES/NO로 결과를 출력한다. (yes/no 를 출력해도 된다)
제출
import java.util.Scanner;
public class Main {
public static int[] parent;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
parent = new int[N + 1];
for (int i = 0; i <= N; i++) {
parent[i] = i;
}
for (int i = 0; i < M; i++) {
int question = sc.nextInt();
int a = sc.nextInt();
int b = sc.nextInt();
if (question == 0) {
union(a, b);
} else {
if (checkSame(a, b)) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
}
public static void union(int a, int b) {
a = find(a);
b = find(b);
if(a != b) {
parent[b] = a;
}
}
public static int find(int a) {
if (a == parent[a])
return a;
else
return parent[a] = find(parent[a]);
}
public static boolean checkSame(int a, int b) {
a = find(a);
b = find(b);
if(a==b) {
return true;
}
return false;
}
}
예제
7 8
0 1 3
1 1 7
0 7 6
1 7 1
0 3 7
0 4 2
0 1 1
1 1 1
결과
1717번: 집합의 표현
첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는
www.acmicpc.net
728x90
'JAVA > 백준' 카테고리의 다른 글
[Java] 백준 1043 거짓말 - 유니온 파인드(3) (0) | 2022.12.04 |
---|---|
[Java] 백준 1976 여행 가자 - 유니온 파인드(2) (0) | 2022.12.03 |
[Java] 백준 2251 물통 - 그래프의 표현(4) (0) | 2022.12.01 |
[Java] 백준 1707 이분 그래프 - 그래프의 표현(3) (0) | 2022.11.30 |
[Java] 백준 1325 효율적인 해킹 - 그래프의 표현(2) (0) | 2022.11.29 |
댓글