출처: https://3months.tistory.com/307 [Deep Play]

백준/Bit Masking

[BOJ] 11723 집합 C++

코딩하는 랄뚜기 2021. 8. 13. 01:22

https://www.acmicpc.net/problem/11723

 

11723번: 집합

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

www.acmicpc.net

메모리를 4MB만 주어지기 때문에 비트마스킹으로 풀어야 하는 문제이다. 비트마스킹의 개념을 알고 싶다면 꼭 풀어야할 문제.

 

코드

#include <iostream>
#include <string>
using namespace std;
 
int M, num, BIT=0;
string s;
int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>M;
    while(M--){
        cin>>s;
        //비스마스킹에서 1<<num은 이진수에서 num번째를 1로 바꾼다는 의미
        if(s=="add"){
            cin>>num;
            //num번째를 1로 바꾼다는 의미
            BIT|=(1<<num);
        }else if(s=="remove"){
            cin>>num;
            //~(1<<num)은 num번째는 0 나머지는 1인 이진수
            BIT&=~(1<<num);
        }else if(s=="check"){
            cin>>num;
            if(BIT&(1<<num)){
                cout<<1<<'\n';
            }else{
                cout<<0<<'\n';
            }
        }else if(s=="toggle"){
            cin>>num;
            //^=(1<<num)을 해주면 num번째가 1이면 0으로 0이면 1로 바꿔준다.
            BIT^=(1<<num);
        }else if(s=="all"){
            //(1<<num)-1은 1이 num개인 이진수를 만든다는 뜻
            BIT=(1<<21)-1;
        }else if(s=="empty"){
            BIT=0;
        }
    }
}

'백준 > Bit Masking' 카테고리의 다른 글

[BOJ] 2098 외판원순회 C++  (0) 2021.08.15
[BOJ] 14391 종이조각 C++  (0) 2021.08.14
[BOJ] 1062 가르침 C++  (0) 2021.08.14
[BOJ] 13701 중복제거 C++  (0) 2021.08.14