알고리즘 문제풀이/백준

[백준/BOJ] 1822번 차집합 (C++)

노력의천재 2021. 9. 26. 17:33

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

 

1822번: 차집합

첫째 줄에는 집합 A의 원소의 개수 n(A)와 집합 B의 원소의 개수 n(B)가 빈 칸을 사이에 두고 주어진다. (1 ≤ n(A), n(B) ≤ 500,000)이 주어진다. 둘째 줄에는 집합 A의 원소가, 셋째 줄에는 집합 B의 원소

www.acmicpc.net

이분 탐색을 이용하면 시간복잡도 O(N * logN)으로 해결할 수 있다. 다만 주의할 점은 a 집합에서 교집합 원소를 제거하는 방식으로 문제를 접근하면 원소의 재배치 과정 때문에 TLE이 발생할 수 있다. 그러므로, 이분 탐색을 통해 찾을 수 없는 원소인 경우에 새로운 벡터에 값을 넣는 방식으로 해결하면 된다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false); 
    cin.tie(0);
    
    int n, m;
    cin >> n >> m;
    vector<int> a(n), b(m), res;
    
    for(int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for(int i = 0; i  < m; i++) {
        cin >> b[i];
    }
    sort(b.begin(), b.end());
    
    for(int i = 0; i < n; i++) {
        int flag = binary_search(b.begin(), b.end(), a[i]);
        if(flag == 0) res.push_back(a[i]);
    }
    
    sort(res.begin(), res.end());
    
    cout << res.size() << "\n";
    for(int i = 0; i < res.size(); i++) {
        cout << res[i] << " ";
    }
}