Computer Science Basics/알고리즘

순열과 조합, 비트마스크

타자치는 문돌이

순열

permutation 함수를 통해 벡터를 순열 순으로 정렬할 수 있다.
이때, a는 정렬되어 있어야 한다.

using namespace std;

int main() {
    vector<int> a = {1, 2, 3};
    sort(a.begin(), a.end());

    do {
        // 이제 a는 while을 돌면서
        // {1, 2, 3}, {1, 3, 2}...로 정렬됨
        for (int x : a) cout << x << " ";
        cout << "\n";
    } while (next_permutation(a.begin(), a.end()));
}

 

조합

5개 중 3개를 선택한다고 하자.
선택한 원소를 1, 아닌 원소를 0으로 00111과 같이 표현할 수 있다.
00111에 대해 permutation을 통해 순열을 구하면 포함 정보를 구할 수 있다.
(00111, 01011, 01101, 01110...)

using namespace std;

int main()
{
    vector<int> idx(n, 0);
    fill(idx.end()-k, idx.end(), 1); // 1이 선택

    do {
        if (idx[i] == 1) // i가 선택된 원소
        {
            ...
        }
    } while (next_permutation(idx.begin(), idx.end()));
}

 

비트마스크

3자리 vector에 대해, 3자리 이진수를 생각해보면
000, 001, 010, 100, 101, 110, 111으로 0을 넣음, 1을 안넣음으로 생각할 수 있다.
원소의 포함/미포함 조합에 대해 특정 로직을 적용하거나, 팀을 나누는 등의 경우에 사용할 수 있다.
이 이진수는 Bitmask를 통해 구한다.

using namespace std;

int main()
{
    vector<int> a = {1, 2, 3};

    for (int mask = 0; mask < (1 << a.size()); i++) // 0(000), 1(001), 2(010)...
    {
        for (int i = 0; i < a.size(); i++)
        {
            if (mask & (1 << i)) // i가 1이면
            {
                a[i] // 포함된 a의 원소
                ...
            }
        }
    }
}
반응형