PS/비트마스킹

백준[C++] 11732 집합

asdsa112 2026. 5. 7. 13:47

<조건 분석>

1. 처음엔 unordered_set으로 접근했음.

 

2. M은 최대 300만. unordered_set의 호출의 평균 연산이 2000cycle 정도임.

 

3. 3,000,000 * 2000 = 60억 cycle. cpu가 3GHz일 때, 약 2초정도 걸림.

 

4. 시간 제한은 1.5초이니 시간초과가 되어버림.

 

5. x가 20 이하의 자연수이니 int라는 하나의 정수 비트 안에 집합을 모두 담을 수 있음.

 

<문제 해결 포인트>

1. Map이나 Set같은 STL 자료구조로 해결하는 것이 아닌 문제의 x 정수 값을 보고 집합을 생각해 비트마스킹을 떠올려야 함.

 

2. check와 같은 경우에는 &= ~() 로, toggle과 같은 경우에는 XOR연산자인 ^=로 해결하면 됨.

 

#include <bits/stdc++.h>
using namespace std;

int bit = 0;

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    
    int cnt;
    cin >> cnt;

    while (cnt--)
    {
        string text;
        int temp;
        cin >> text;

        if (text == "add")
        {
            cin >> temp;
            bit |= (1 << temp);
        }
        else if (text == "remove")
        {
            cin >> temp;
            bit &= ~(1 << temp);
        }
        else if (text == "check")
        {
            cin >> temp;
            if (bit & (1 << temp)) cout << 1 << "\n";
            else cout << 0 << "\n";
        }
        else if (text == "toggle")
        {
            cin >> temp;
            bit ^= (1 << temp);
        }
        else if (text == "all")
        {
            bit = (1 << 21) - 1;
        }
        else if (text == "empty")
        {
            bit = 0;
        }
    }

    return 0;
}

'PS > 비트마스킹' 카테고리의 다른 글

백준 [C++] 1285 동전 뒤집기  (0) 2026.05.31
백준 [C++] 19942 다이어트  (0) 2026.05.28
백준 [C++] 14391 종이 조각  (0) 2026.05.08
백준[C++] 2234 성곽  (0) 2026.05.07
백준[C++] 1062번 가르침  (0) 2026.05.04