본문 바로가기
백준

[1269] 대칭 차집합

by kmyobin 2022. 7. 30.

 

대칭 차집합 : (A-B) U (B-A)

 

처음에는 메모이제이션을 이용하여 배열을 크게 잡았더니 메모리 초과가 났다

#include <iostream>
using namespace std;

int N, M;
int A[100000001];
int B[100000001];
int larger1 = -1;
int larger2 = -1;
int cnt;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	cin >> N >> M;
	for (int i = 0; i < N; i++)
	{
		int input;
		cin >> input;
		A[input]++;
		if (input > larger1)larger1 = input;
	}
	for (int i = 0; i < M; i++) {
		int input;
		cin >> input;
		B[input]++;
		if (input > larger2)larger2 = input;
	}

	for (int i = 0; i <= larger1; i++)
	{
		if (A[i]) {
			if (!B[i])cnt++;
		}
	}
	for (int i = 0; i <= larger2; i++)
	{
		if (B[i]) {
			if (!A[i])cnt++;
		}
	}

	printf("%d", cnt);
}

 

그래서 결국 집합을 썼다..

집합 2개를 만들고 for문을 2번 돌린다

중복된 숫자가 없다면 count를 세주어 대칭 차집합의 개수를 증가시켜줬다

중복된 숫자를 찾는 코드는 find함수를 이용한다

if (myset2.find(*iter) != myset2.end()) // 중복된 숫자가 있다면

 

완성된 코드는 아래와 같다

#include <iostream>
#include <set>
using namespace std;

int N, M;
int cnt;
set<int> myset1;
set<int> myset2;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	cin >> N >> M;
	for (int i = 0; i < N; i++)
	{
		int input;
		cin >> input;
		myset1.insert(input);
	}

	for (int i = 0; i < M; i++) {
		int input;
		cin >> input;
		myset2.insert(input);
	}

	set<int> ::iterator iter;
	for (iter = myset1.begin(); iter != myset1.end(); iter++)
	{
		if (myset2.find(*iter) != myset2.end()) { // 중복된 숫자가 있다면

		}
		else {
			cnt++;
		}
	}
	for (iter = myset2.begin(); iter != myset2.end(); iter++)
	{
		if (myset1.find(*iter) != myset1.end()) { // 중복된 숫자가 있다면

		}
		else {
			cnt++;
		}
	}
	printf("%d", cnt);
}

 

'백준' 카테고리의 다른 글

[2477] 참외밭  (0) 2022.08.12
[11478] 서로 다른 부분 문자열의 개수  (0) 2022.07.30
[1764] 듣보잡  (0) 2022.07.29
[10816] 숫자 카드 2  (0) 2022.07.29
[1620] 나는야 포켓몬 마스터 이다솜  (0) 2022.07.27

댓글