Algorithm/BOJ

[BOJ] #1269 대칭 차집합

jHoon0223 2023. 10. 30. 16:17

https://www.acmicpc.net/problem/1269

 

1269번: 대칭 차집합

첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어

www.acmicpc.net


처음엔 중복제거를 통해 해결해야하나 고민하던 찰나 구글링으로 vector에서 집합 관련된 연산을 간단히 수행할 수 있게 해주는 라이브러리가 있다 해서 활용해보았다. 입력의 최댓값이 200,000이기에 코드의 시간복잡도가 O(N^2)가 될 수 없기에 라이브러리를 활용해 간단히 해결해보았다. 대칭 차집합 뿐만 아니라 다른 합집합, 교집합 등의 연산들도 같은 라이브러리 안에서 수월하게 적용할 수 있다. 이때 주의할 점은 대칭 차집합으로 새롭게 만들어진 vector의 경우 새롭게 size를 늘려주어야 한다. 입력받은 vector두개가 합집합이 된것이기에 자연스레 크기가 늘어났기 때문이다. 따라서, set_symmetric_difference를 써서 대칭차집합을 구한 이후에는 꼭 vector resize를 통해 사이즈를 늘려주어야한다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

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

    int A,B;
    cin >> A >> B;

    vector<int> Va, Vb;
    for (int i=0; i<A; i++) {
        int n;
        cin >> n;
        Va.push_back(n);
    }
    for (int i=0; i<B; i++) {
        int n;
        cin >> n;
        Vb.push_back(n);
    }
    sort(Va.begin(), Va.end());
    sort(Vb.begin(), Vb.end());

    vector<int> res(Va.size() + Vb.size());
    vector<int>::iterator iter;
    iter = set_symmetric_difference(Va.begin(), Va.end(), Vb.begin(), Vb.end(), res.begin());
    res.resize(iter - res.begin());
    
    cout << res.size() << '\n';

    return 0;
}

 

728x90

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] #2346 풍선 터뜨리기  (0) 2023.11.02
[BOJ] #11866 요세푸스 문제0  (0) 2023.11.02
[BOJ] #1620 나는야 포켓몬 마스터 이다솜  (0) 2023.10.30
[BOJ] #10816 숫자카드2  (0) 2023.10.27
[BOJ] #10815 숫자카드  (0) 2023.10.27