본문 바로가기

알고리즘

[백준 알고리즘 c++] 문제 55.대칭 차집합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을 넘지 않는다.

출력
첫째 줄에 대칭 차집합의 원소의 개수를 출력한다.

 

[나의 풀이]

문제
1. 대칭 차집합의 원소의 개수를 출력하라.
입력
1. 집합 A와 B를 입력 받는다.
2. 집합 A만큼 반복문을 돌려 원소를 입력 받는다.
3. 집합 B만큼 반복문을 돌려 원소를 입력 받는다. 
처리
1. 집합 2개를 받을 set 집합을 입력 받는다.
2. B만큼 원소를 입력 받을때 A와 중복 값이 있는지 체크하고 카운트 한다. => set은 이분탐색

 

[소스 코드]

#include <iostream>
#include <set>

using namespace std;

int main()
{

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	//
	// 문제
	// 1. 대칭 차집합의 원소의 개수를 출력하라.
	// 입력
	// 1. 집합 A와 B를 입력 받는다.
	// 2. 집합 A만큼 반복문을 돌려 원소를 입력 받는다.
	// 3. 집합 B만큼 반복문을 돌려 원소를 입력 받는다. 
	// 처리
	// 1. 집합 2개를 받을 set 집합을 입력 받는다.
	// 2. B만큼 원소를 입력 받을때 A와 중복 값이 있는지 체크하고 카운트 한다. => set은 이분탐색
	// 출력
	//
	int A, B;
	cin >> A >> B;

	set<int> set1;
	for (int i = 0; i < A; i++)
	{
		int num;
		cin >> num;
		set1.insert(num);
	}

	int mixCount = 0;
	for (int i = 0; i < B; i++)
	{
		int num;
		cin >> num;
		if (set1.find(num) != set1.end())
		{
			mixCount++;
		}
	}

	cout << A + B - mixCount * 2 << "\n";

	return 0;
}

다른 풀이)

#include <iostream>
#include <map>
using namespace std;
map<int, bool> m;
int N,M;
int num;
int main(void)
{
	cin >> N >> M;
	for (int i = 0; i < N+M; i++)
	{
		cin >> num;
		if (m[num] == true) // 이미 존재하면 map에서 제거를 한다.
			m.erase(num);
		else // 존재 안하면 추가를 해준다.
			m[num] = true;
	}
	cout << m.size(); // 남은 map 사이즈를 출력

}

 

[피드백]

반응형