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개의 집합을 이루고 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다.
집합을 표현하는 프로그램을 작성하시오.
입력
첫째 줄에 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 를 출력해도 된다)
풀이
/*
* 입력
* 1. n m
* 2. m개의 줄에 각각의 연산 주어짐
* 출력
* 1. 1로 시작하는 입력에 대해서 YES/NO로 결과 출력
* 조건
* 1. 합집합은 0 a b
* 2. 같은 집합에 포함되어 있는지를 확인 1 a b
*
* 유니온 파인드
* >> 부모가 같은지 확인한다
* >> 재귀 이용
*/
유니온 파인드의 기본이 되는 문제다 재귀를 이용해 각 노드의 부모 노드가 같은지 확인하면 된다 부모 노드를 확인하는 findParent 함수, 부모 노드가 같은지 확인하는 isSameParent 함수, 합집합을 만드는 union 함수를 사용했다
코드
package lv28_유니온파인드;
import java.io.*;
import java.util.*;
public class g4_1717_집합의표현 {
static int n, m;
static int[] parent;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
parent = new int[n+1];
for(int i = 1; i<=n; i++) {
parent[i] = i;
}
for(int i = 0; i<m; i++) {
st = new StringTokenizer(br.readLine());
int sw = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
if(sw == 0) union(x, y);
else sb.append(isSameParent(x, y)).append("\n");
}
System.out.println(sb);
}
private static int findParent(int x) {
if(x==parent[x]) return x;
else return parent[x] = findParent(parent[x]);
}
private static String isSameParent(int x, int y) {
x = findParent(x);
y = findParent(y);
if(x==y) return "YES";
else return "NO";
}
private static void union(int x, int y) {
x = findParent(x);
y = findParent(y);
if(x!=y) {
if(x<y) parent[y] = x;
else parent[x]=y;
}
}
}
결과
#자바 #java #boj #백준 #알고리즘
'알고리즘 > BOJ' 카테고리의 다른 글
[java][boj][g4] 1976. 여행 가자 (0) | 2022.04.01 |
---|---|
[java][boj][s2] 4963. 섬의 개수 (0) | 2022.03.31 |
[java][boj][s1] 11052. 카드 구매하기 (0) | 2022.03.30 |
[java][boj][s5] 1010. 다리 놓기 (0) | 2022.03.25 |
[java][boj][g2] 12015. 가장 긴 증가하는 부분 수열 2 (0) | 2022.03.24 |