Hoon222y

Set 을 이용한 집합연산 C++ STL 본문

코딩/사소한 팁

Set 을 이용한 집합연산 C++ STL

hoon222y 2017. 10. 3. 16:04
https://www.acmicpc.net/problem/1269

해당 문제를 풀다가 set STL을 이용하여 집합 연산을 쉽게 해결할 수 있는 방법을 알게되었다. (여집합 차집합 교집합 등등)


union , intersection , difference , symmetric difference를 이용해서 해결한다. 이때 주의할 점은 아래 코드처럼 정답이 저장되어질 배열에 크기가 충분하게 할당이 되어야 한다는 점이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main()
{
    vector<int> vec1({0,1,2,3,4,5,6,7,8});
    vector<int> vec2({0,1,2,3,4});
    
    //부분집합 판정
    if(includes(vec1.begin(), vec1.end(), vec2.begin(), vec2.end()))
    {
        cout<<"vec1 include vec2"<<endl;
    }
    else{
        cout<<"vec1 don't include vec2"<<endl;
    }
    
    vec2.push_back(9);
    
    //합집합  vec1 + vec2
    vector<int> result;
    result.resize(vec1.size()+vec2.size());//공간확보
    auto itr = set_union(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());//합집합
    result.erase(itr, result.end());//남은공간 제거
    for_each(result.begin(), result.end(), [](int i){cout<<i<<" ";});//출력
    cout<<endl;
    
    //교집합 vec1 intersection vec2
    result.clear();
    result.resize(vec1.size()+vec2.size());//공간확보
    itr = set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());//교집합
    result.erase(itr, result.end());//남은공간 제거
    for_each(result.begin(), result.end(), [](int i){cout<<i<<" ";});//출력
    cout<<endl;
    
    //차집합 vec1 - vec2
    result.clear();
    result.resize(vec1.size()+vec2.size());//공간확보
    itr = set_difference(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());//차집합
    result.erase(itr, result.end());//남은공간 제거
    for_each(result.begin(), result.end(), [](int i){cout<<i<<" ";});//출력
    cout<<endl;
    
    
    //대칭차집합 vec1 EX_OR vec2
    result.clear();
    result.resize(vec1.size()+vec2.size());//공간확보
    itr = set_symmetric_difference(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());//교집합
    result.erase(itr, result.end());//남은공간 제거
    for_each(result.begin(), result.end(), [](int i){cout<<i<<" ";});//출력
    cout<<endl;
    
    
    return 0;
 
}
[출처] [c++ STL] 집합 알고리즘|작성자 지피지기
cs

 



Comments