https://www.acmicpc.net/problem/1269
문제
자연수를 원소로 갖는 공집합이 아닌 두 집합 A와 B가 있다. 이때, 두 집합의 대칭 차집합의 원소의 개수를 출력하는 프로그램을 작성하시오. 두 집합 A와 B가 있을 때, (A-B)와 (B-A)의 합집합을 A와 B의 대칭 차집합이라고 한다.
예를 들어, A = { 1, 2, 4 } 이고, B = { 2, 3, 4, 5, 6 } 라고 할 때, A-B = { 1 } 이고, B-A = { 3, 5, 6 } 이므로, 대칭 차집합의 원소의 개수는 1 + 3 = 4개이다.
입력
첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어진다. 각 집합의 원소의 개수는 200,000을 넘지 않으며, 모든 원소의 값은 100,000,000을 넘지 않는다.
출력
첫째 줄에 대칭 차집합의 원소의 개수를 출력한다.
문제 풀이
set을 활용한 문제.
대칭 차집합은 합집합에서 교집합을 제외한 것이다. 교집합에 해당하는 원소들은 각각 A와 B에서 한 번씩 나오므로 총 두번씩 나온다. 따라서 대칭 차집합에 속하는 원소의 개수는 A의 개수+B의 개수 - 2 * 교집합에 해당하는 원소의 개수가 된다.
A와 B의 원소를 각각 set에 저장한 후, A의 원소가 B에 있는지 set::find로 확인한다. 존재한다면 교집합 원소의 개수를 1 증가시켜 답을 구한다.
아래는 코드.
더보기
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int N, M;
int num;
int duplicate = 0;
set<int> s1;
set<int> s2;
set<int>::iterator iter;
set<int>::iterator it;
cin >> N >> M;
for (int i = 0; i < N; i++)
{
cin >> num;
s1.insert(num);
}
for (int i = 0; i < M; i++)
{
cin >> num;
s2.insert(num);
}
for (iter = s1.begin(); iter !=s1.end(); iter ++)
{
it = s2.find(*iter);
if (it != s2.end())
{
duplicate++;
}
}
cout << N + M - (2 * duplicate) << "\n";
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 1062] 가르침 (C++) (0) | 2024.06.20 |
---|---|
[백준 1939] 중량제한 (C++) (0) | 2024.06.19 |
[백준 5397] 키로거 (C++) (0) | 2024.06.17 |
[백준 9576] 책 나눠주기 (C++) (0) | 2024.06.16 |
[백준 2485] 가로수 (C++) (0) | 2024.06.15 |