[STL] next_permutation

less than 1 minute read

next_permutation

<algorithm> 헤더에 정의되어 있으며 함수 원형은 다음과 같다.

// default
template <class BidirectionalIterator>
bool next_permutation (BidirectionalIterator first, BidirectionalIterator last);

// custom
template <class BidirectionalIterator, class Compare>
bool next_permutation (BidirectionalIterator first, BidirectionalIterator last, Compare comp);

해당 함수는 구성된 데이터의 순열을 만들어서 보여 준다. 현재 기준으로 operator< 연산을 통해, 다음 순열이 존재한다면 true를 반환하고 container의 값을 바꾸어 준다.

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

using namespace std;

int main(){
    vector<int> arr;

    arr.push_back(1);
    arr.push_back(2);
    arr.push_back(3);

    /**
     * 출력
     * 1 2 3
     * 1 3 2
     * 2 1 3
     * 2 3 1
     * 3 1 2
     * 3 2 1
     */
    do{
        for(int cur : arr) cout << cur << " ";
        cout << "\n";
    }while(next_permutation(arr.begin(), arr.end()));

    /**
     * 자매품 prev_permutation도 존재한다.
     * 모든 경우의 수를 표현하기 위해서는 vector가 역순으로 정렬되어 있어야 한다.
     * 출력
     * 3 2 1
     * 3 1 2
     * 2 3 1
     * 2 1 3
     * 1 3 2
     * 1 2 3
     */
     sort(arr.begin(), arr.end(), greater<int>());
     do{
        for(int cur : arr) cout << cur << " ";
        cout << "\n";
    }while(prev_permutation(arr.begin(), arr.end()));
}

Leave a comment