https://www.acmicpc.net/problem/1269
각 집합 A,B에 대한 입력을 받고 A-B와 B-A의 합집합을 구하면 된다. 나는 set 자료형을 사용하여 두 집합을 입력받은 뒤 각 집합을 순회하면서 find함수를 통해 해당원소가 다른 집합의 원소가 아니라면 정답 set자료형에 넣어주고 마지막으로 그 자료형의 크기를 출력해주었다.
하지만 STL의 set_difference 알고리즘을 사용하는 것이 각 집합간의 차집합을 구하는데 효율적일 수 있다.
set_difference는 정렬된 범위에서 한 집합에서 다른 집합에 없는 요소를 추출한다.
set_difference 함수는 각 집합의 시작과 끝, 결과값을 저장할 변수를 매개변수로 사용한다.
set_difference
template< class InputIt1, class InputIt2, class OutputIt >
OutputIt set_difference( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
OutputIt d_first );
정답코드1(순회)
#include "iostream"
#include "set"
using namespace std;
set<int> s1, s2, answer;
int main()
{
int n, m;
cin >> n >> m;
//집합만들기
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
s1.insert(x);
}
for (int i = 0; i < m; i++)
{
int x;
cin >> x;
s2.insert(x);
}
int cnt = 0;
for (auto it = s1.begin(); it != s1.end(); it++)
{
if (s2.find(*it) == s2.end()) cnt++;
}
for (auto it = s2.begin(); it != s2.end(); it++)
{
if (s1.find(*it) == s1.end()) cnt++;
}
cout << cnt << endl;
}
정답코드2(STL알고리즘 활용)
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
set<int> s1, s2; // 두 집합을 저장할 set
// 집합 A 입력
for (int i = 0; i < n; i++) {
int x;
cin >> x;
s1.insert(x);
}
// 집합 B 입력
for (int i = 0; i < m; i++) {
int x;
cin >> x;
s2.insert(x);
}
vector<int> diff1, diff2; // 차집합을 저장할 벡터
// A - B 차집합
set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), back_inserter(diff1));
// B - A 차집합
set_difference(s2.begin(), s2.end(), s1.begin(), s1.end(), back_inserter(diff2));
// 대칭 차집합의 원소 개수
cout << diff1.size() + diff2.size() << endl;
return 0;
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준][C++]9012번. 괄호 (0) | 2024.10.02 |
---|---|
[백준][C++]11478번. 서로 다른 부분 문자열의 개수 (0) | 2024.10.01 |
[백준][C++]1764번. 듣보잡 (0) | 2024.09.30 |
[백준][C++]1620번. 나는야 포켓몬 마스터 이다솜 (3) | 2024.09.27 |
[백준][C++]7785번. 회사에 있는 사람 (4) | 2024.09.26 |