백준 1269(대칭 차집합)

jh Seo·2023년 2월 14일
0

백준

목록 보기
129/180

개요

백준 1269번: 대칭 차집합

  • 입력
    첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어진다. 각 집합의 원소의 개수는 200,000을 넘지 않으며, 모든 원소의 값은 100,000,000을 넘지 않는다.

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

접근 방식

  1. 서로 포함한 걸 알아야하므로 Set자료구조가 떠올랐다.

  2. A집합과 B집합의 set을 두 개 만들고
    각각 원소를 상대 집합의 set에서 찾아보며 답을 내는식으로 구현하였다.

  3. 생각해보니 Set하나만 써도 구현이 가능하였다.

전체 코드(Set 두개 사용)

#include<iostream>
#include<unordered_set>

using namespace std;
unordered_set <int> groupA;
unordered_set<int> groupB;
int groupASize,groupBsize;

void Input() {
	int inputSetElem=0;
	cin >> groupASize>>groupBsize;
    //A 원소들 Set에 넣어줌
	for (int i = 0; i < groupASize; i++) {
		cin >> inputSetElem;
		groupA.insert(inputSetElem);
	}
    //B원소들 set에 넣어줌
	for (int i = 0; i < groupBsize; i++) {
		cin >> inputSetElem;
		groupB.insert(inputSetElem);
	}
}

void Solution() {
	int Ans = 0;
    //A의 원소중 B와 겹치는거 탐색
	for (int elem : groupA) {
		if (groupB.find(elem) == groupB.end()) {
			Ans++;
		}
	}
    //B의 원소 중 A와 겹치는거 탐색
	for (int elem : groupB) {
		if (groupA.find(elem) == groupA.end()) {
			Ans++;
		}
	}
	cout << Ans;
}

int main(){
	Input();
	Solution();
}

전체 코드 (Set 하나 사용)

#include<iostream>
#include<unordered_set>

using namespace std;
unordered_set <int> groupA;
int groupASize,groupBSize,commonElemsAmount;

void Input() {
	int inputSetElem=0;
	cin >> groupASize>>groupBSize;
	//그룹 A값을 다 groupA에 넣고
	for (int i = 0; i < groupASize; i++) {
		cin >> inputSetElem;
		groupA.insert(inputSetElem);
	}
	//B의 원소들을 그룹A에서 탐색후 공통원소라면 commonElemsAmount값 증가
	for (int i = 0; i < groupBSize; i++) {
		cin >> inputSetElem;
		if (groupA.find(inputSetElem) != groupA.end()) {
			commonElemsAmount++;
		}
	}

}

void Solution() {
	//총 사이즈에서 공통값 2배 빼면 답
	int Ans = groupASize+groupBSize-2 * commonElemsAmount;
	cout << Ans;
}

int main(){
	Input();
	Solution();
}

문풀후생

set을 이용하면 중복값을 빠르게 체크할 수 있는 문제다

profile
코딩 창고!

0개의 댓글