728x90
대칭 차집합
시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
2 초 | 256 MB | 18095 | 11293 | 9350 | 63.150% |
문제
자연수를 원소로 갖는 공집합이 아닌 두 집합 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 복사
3 5
1 2 4
2 3 4 5 6
예제 출력 1 복사
4
틀린 코드
#include <bits/stdc++.h>
using namespace std;
int n,m,a[200004],b[200004], cnt;
int main(){
ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
//1. 입력받기
cin >> n >> m;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<m;i++)cin>>b[i];
sort(a,a+n); sort(b,b+m); //정렬하기
//2. 대칭 차집합 구하기
for(int i=0;i<n;i++){
if(upper_bound(b,b+m,a[i])-lower_bound(b,b+m,a[i])>0) cnt++;
}
for(int i=0;i<m;i++){
cout << b[i] << " ";
if(upper_bound(a,a+n,b[i])-lower_bound(a,a+n,b[i])>0) cnt++;
}
//3. 정답 출력
cout << cnt;
}
원소의 개수라고해서 lower_bound, upper_bound를 사용했는데, 틀렸다.
문제를 꼼꼼하게 읽어보니 (A-B) + (B-A)의 합집합을 구하는 문제였다. (원소가 겹치면 하나로 셈)
선생님의 코드를 참조하며 풀었다. -map사용
counting(개수 세기)는 map 또는 배열!
원소는 1억까지 가능하므로 배열 사용시에 공간복잡도가 너무 크다 => map 사용!
맞은 코드
#include <bits/stdc++.h>
using namespace std;
int n,m, cnt, temp;
map<int,int> mp;
int main(){
ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
//1. 입력받기
cin >> n >> m;
for(int i=0;i<n;i++){
cin>>temp;
mp[temp]++;
}
for(int i=0;i<m;i++){
cin >> temp;
mp[temp]++;
}
//2. 대칭 차집합 구하기
for(auto it:mp){
if(it.second==1) cnt++;
}
//3. 정답 출력
cout << cnt;
}
겹치면 원소의 개수가 2, 안겹치고 원소 존재하면 개수가 1, 아예 원소가 없으면 0이므로
it.second가 1일때가 정답이다.
728x90
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
2098번: 외판원 순회 (2) | 2023.03.11 |
---|---|
7주차: DP(Dynamic Programming) , 2240번: 자두 나무, 15989번: 1, 2, 3 더하기 4 (2) | 2023.03.11 |
7795번 : 먹을 것인가 먹힐 것인가 [C++] , lower_bound, upper_bound (2) | 2023.03.11 |
6236번 : 용돈 관리 (0) | 2023.03.10 |
2343번: 기타 레슨 (0) | 2023.03.10 |