본문 바로가기

Algorithm Problems/수학

[백준/C++] 1269번: 대칭 차집합

문제

https://www.acmicpc.net/problem/1269


문제 요약

자연수를 원소로 갖는 두 집합 A, B가 주어졌을 때,

 

두 집합의 대칭 차집합의 원소 개수를 출력한다.

 

대칭 차집합이란, (A - B) U (B - A) 를 의미한다.


코드

#include <iostream>
#include <algorithm>
#include <set>

using namespace std;

set<int> A, B, res;

int n, m;

int main() {
	// 입출력 단축
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		int num;
		cin >> num;

		A.insert(num);
	}

	for (int i = 0; i < m; i++) {
		int num;
		cin >> num;

		B.insert(num);
	}

	set_symmetric_difference(A.begin(), A.end(), B.begin(), B.end(), inserter(res, res.begin()));

	cout << res.size();

	return 0;
}

코드 설명

C++ STL 라이브러리 <set> 을 사용하여 문제를 해결한다.


고찰

그 외 집합 연산에 대해 다시 한 번 공부하는 계기가 되었다.

 

1. 합집합

set_union(A.begin(), A.end(), B.begin(), B.end(), inserter(res, res.begin()));

 

2. 교집합

set_intersection(A.begin(), A.end(), B.begin(), B.end(), inserter(res, res.begin()));

 

3. 차집합

set_difference(A.begin(), A.end(), B.begin(), B.end(), inserter(res, res.begin()));

 

4. 대칭 차집합

set_symmetric_difference(A.begin(), A.end(), B.begin(), B.end(), inserter(res, res.begin()));

 

추가로, inserter는 결과를 특정 집합에 저장하는 역할을 한다.