※주의※
저의 풀이가 정답은 아닙니다.
다른 코드가 더 효율적이거나 좋을 수 있습니다.
언제나 다른 사람의 코드는 참고만 하시기 바랍니다.
[문제 풀이 사이트]
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 를 출력해도 된다)
[입출력 예]
입력 | 출력 |
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 |
NO NO YES |
[문제 풀이]
Union-Find 알고리즘 문제이다.
관련 내용은 아래 포스트에 설명해두었다.
[Algorithm] 유니온 파인드(Union-Find)
그래프 알고리즘 중 Union-Find 에 대해서 공부한 내용입니다. 잘못된 부분이 있을 수 있습니다. 잘못된 부분이 있다면 지적부탁드립니다! 유니온 파인드(Union-Find)란? 여러개의 노드가 존재할 때 두
park-peanut.tistory.com
[최종 코드]
[GitHub]
GitHub - SmallPeanutPark/BAEKJOON: Study BaekJoon for Coding Test
Study BaekJoon for Coding Test. Contribute to SmallPeanutPark/BAEKJOON development by creating an account on GitHub.
github.com
#include <bits/stdc++.h>
using namespace std;
vector<int> parent;
int getParent(int a) {
if(parent[a] == a) return a;
else return parent[a] = getParent(parent[a]);
}
void unionParent(int a, int b) {
a = getParent(a);
b = getParent(b);
if(a == b) return;
if(a < b) parent[b] = a;
else parent[a] = b;
}
bool isSameParent(int a, int b) {
a = getParent(a);
b = getParent(b);
if(a == b) return true;
else return false;
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
for(int i = 0; i <= n; ++i) {
parent.emplace_back(i);
}
for(int i = 0; i < m; ++i) {
int z, a, b; // z : 0 이면 합집합 연산, 1이면 같은 집합인지 확인
cin >> z >> a >> b;
if(z == 0) {
// 합집합 Union
unionParent(a, b);
} else {
// 같은 그래프 확인 Find
if(isSameParent(a, b)) {
cout << "YES" << '\n';
} else {
cout << "NO" << '\n';
}
}
}
return 0;
}
'PS > BaekJoon' 카테고리의 다른 글
[BaekJoon 1629번] 곱셈(C++) (0) | 2022.08.29 |
---|---|
[BaekJoon 18352번] 특정 거리의 도시 찾기(C++) (0) | 2022.08.29 |
[BaekJoon 11779번] 최소비용 구하기 2(C++) (0) | 2022.08.25 |
[BaekJoon 1753번] 최단경로(C++) (0) | 2022.08.22 |
[BaekJoon 11000번] 강의실 배정(C++) (0) | 2022.08.22 |
댓글