https://www.acmicpc.net/problem/11723
#include <iostream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
const int MAX = 20;
int M, S = 0;
cin >> M;
while (M--)
{
string cmd;
int x;
cin >> cmd;
// x를 추가
if (cmd == "add")
{
cin >> x;
S |= (1 << --x);
}
// x를 제거
else if (cmd == "remove")
{
cin >> x;
S &= ~(1 << --x);
}
// x를 검사
else if (cmd == "check")
{
cin >> x;
cout << ((S & (1 << --x)) > 0) << '\n';
}
// x를 토글 (0을 1로, 1을 0으로)
else if (cmd == "toggle")
{
cin >> x;
S ^= (1 << --x);
}
// 전체 집합
else if (cmd == "all")
{
S = (1 << MAX) - 1;
}
// 공집합
else if (cmd == "empty")
{
S = 0;
}
}
return 0;
}
비트마스크 연습용 문제!
TIP
이 문제의 경우는 check 명령어만 true/false를 출력하면 된다.
따라서 아래 <틀린연산> 처럼 1을 x번 옮겨서 연산해도 AC는 나온다.
하지만 엄밀히 말하면 틀린연산.
1의 자리를 버리게 된다 아깝잖아 ..
/* S에 x를 추가할 때 */
// 올바른 연산
S |= (1 << --x);
// 틀린 연산
S |= (1 << x);
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ]14391번: 종이 조각 (c++) (0) | 2020.05.22 |
---|---|
[BOJ]1182번: 부분수열의 합 (c++) (0) | 2020.05.22 |
[BOJ]1248번: 맞춰봐 (c++) (0) | 2020.05.22 |
[BOJ]2529번: 부등호 (c++) (0) | 2020.05.21 |
[BOJ]15661번: 링크와 스타트 (c++) (0) | 2020.05.21 |
댓글