Algorithm/BOJ
[BOJ] #1269 대칭 차집합
jHoon0223
2023. 10. 30. 16:17
https://www.acmicpc.net/problem/1269
1269번: 대칭 차집합
첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어
www.acmicpc.net
처음엔 중복제거를 통해 해결해야하나 고민하던 찰나 구글링으로 vector에서 집합 관련된 연산을 간단히 수행할 수 있게 해주는 라이브러리가 있다 해서 활용해보았다. 입력의 최댓값이 200,000이기에 코드의 시간복잡도가 O(N^2)가 될 수 없기에 라이브러리를 활용해 간단히 해결해보았다. 대칭 차집합 뿐만 아니라 다른 합집합, 교집합 등의 연산들도 같은 라이브러리 안에서 수월하게 적용할 수 있다. 이때 주의할 점은 대칭 차집합으로 새롭게 만들어진 vector의 경우 새롭게 size를 늘려주어야 한다. 입력받은 vector두개가 합집합이 된것이기에 자연스레 크기가 늘어났기 때문이다. 따라서, set_symmetric_difference를 써서 대칭차집합을 구한 이후에는 꼭 vector resize를 통해 사이즈를 늘려주어야한다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int A,B;
cin >> A >> B;
vector<int> Va, Vb;
for (int i=0; i<A; i++) {
int n;
cin >> n;
Va.push_back(n);
}
for (int i=0; i<B; i++) {
int n;
cin >> n;
Vb.push_back(n);
}
sort(Va.begin(), Va.end());
sort(Vb.begin(), Vb.end());
vector<int> res(Va.size() + Vb.size());
vector<int>::iterator iter;
iter = set_symmetric_difference(Va.begin(), Va.end(), Vb.begin(), Vb.end(), res.begin());
res.resize(iter - res.begin());
cout << res.size() << '\n';
return 0;
}
728x90