알고리즘/알고리즘 문제풀이

1269번: 대칭 차집합

mint* 2023. 3. 11. 11:48
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