비트마스크를 몰라서 그냥 풀어봤는데 맞았다. 그냥 조건에 맞추어서 배열 값을 변경해주면 되는 문제였다.
비트마스킹 연산 안한 버전
#include<iostream>
#include<string>
using namespace std;
bool bit[21];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int M;
cin >> M;
int count = 0;
/*add x : S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.
remove x : S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.
check x : S에 x가 있으면 1을, 없으면 0을 출력한다. (1 ≤ x ≤ 20)
toggle x : S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
all : S를{ 1, 2, ..., 20 } 으로 바꾼다.
empty : S를 공집합으로 바꾼다.*/
string s="";
int x = 0;
while (M--) {
cin >> s;
if (s != "all" && s != "empty")
cin >> x;
if (s == "add")
{
bit[x] = true;
}
else if (s == "remove")
{
bit[x] = false;
}
else if (s == "check")
{
count++;
cout << bit[x] << "\n";
}
else if (s == "toggle")
{
if (bit[x])
bit[x] = false;// S에 x가 있으면 제거하고
else
bit[x] = true;//없으면 추가
}
else if (s == "all")
{
for (int i = 1; i <= 20; i++)
bit[i] = true;
}
else
{
for (int i = 1; i <= 20; i++)
bit[i] = false;
}
/*cout << endl;
cout << M << endl;*/
}
}
비트 마스킹 연산을 사용해서 푼 버전
#include<iostream>
#include<string>
#include<bitset>
using namespace std;
int M, bit=0,x;
string S;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> M;
while (M--) {
cin >> S;
if (S == "add")
{
cin >> x;
bit |= (1 << x); //1을 x 만큼 왼쪽으로 쉬프트 하고 bit하고 or 연산
//cout << bit << endl;
}
else if (S == "remove")
{
cin >> x;
bit &= ~(1 << x); //1을 x 만큼 왼쪽으로 쉬프트 하고 ~하고 bit하고 and 연산
}
else if (S == "check")
{
cin >> x;
cout << (bit & (1 << x) ? 1 : 0)<< "\n";
}
else if (S == "toggle")
{
cin >> x;
bit ^= 1 << x ; //xor 연산
}
else if (S == "all")
{
bit = -1;
//변수에 -1을 넣으면 컴퓨터는 2의 보수 체계를 가지고 있기 때문에 모든 비트가 1이 된다.
}
else
bit = 0;
}
}