ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] next_permutation을 사용한 조합 만들기
    C_C++ 프로그래밍/C_C++ 프로그래밍 2019. 4. 21. 21:28

    순열을 사용하여 조합을 만들어내는 방법입니다.


    로직을 설명하면 vector <int>를 2개를 선언하고

    하나는 원소를 삽입하는 vector <int> list를

    또 다른 하나는 순서 제어를 위해서

    next_permutation사용할 vector <int> idx를 만듭니다.


    이어서

    몇 개의 원소를 뽑을지 결정하는 변수 r 만큼

    idx에 1

    list의 크기 (n이라고 하겠습니다) - r 만큼

    idx에 0을 넣습니다.


    그 뒤로 idx를 next_permutation을 사용하여 반복하여

    idx의 원소가 1일 때마다 list의 원소를 출력해주면 됩니다.


    저는 내림차순으로 출력하기 위해서 desc라는 함수를 따로 작성하였습니다.




    소스코드

    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
    // Combination 
    // using STL's next_permutation
     
    #include<iostream>
    #include<algorithm>
    #include<vector>
     
    using namespace std;
     
    bool desc(int a, int b){
        return a > b;
    }
     
    int main(){
        int n;
        int r;
        vector<int> idx;
        vector<int> list;
        
        cout << "몇 개의 원소를 가진 배열입니까?" << '\n';
        cin >> n;
        cout << "원소를 삽입하세요" << '\n';
        for(int i = 0; i < n; i++){
            int tmp;
            cin >> tmp;
            list.push_back(tmp);
        }
        
        cout << "몇 개의 원소를 뽑아냅니까?" << '\n';
        cin >> r;
        for(int i = 0; i < r; i++)
            idx.push_back(1);
        for(int i = 0; i < n-r; i++)
            idx.push_back(0);
        sort(idx.begin(), idx.end(),desc);
        
        do{
            for(int i = 0; i < n; i++){
                if(idx[i] == 1)
                    cout << list[i];
            }
            cout << '\n';
        }while(next_permutation(idx.begin(), idx.end(),desc));
        
        return 0;
    }
    cs



    ※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다.

    반응형
Designed by Tistory.