
풀이
집합을 아래와 같이 비트로 표현 할 수 있다.
{1, 2, 3, 4, 5} -> 11111
{2, 3, 4, 5} -> 11110
{1, 3, 5} -> 10101
i 번째 비트만 1로 바꾸기 == or 연산
set = set | (1 << (i -1));
ex) i = 2 일때, 0000 | (1 << 1 ) -> 0000 | 0010 -> 0010
i 번째 비트만 0로 바꾸기 == and 연산
set = set & ~(1 << (i -1));
ex) i = 2 일때, 1111 & (1 << 1 ) -> 1111 & ~0010 -> 1111 & 1101 -> 1101
i 번째 비트만 뒤집기 == xor 연산
set = set ^ (1 << (i -1));
ex) i = 2 일때, 1111 ^ (1 << 1 ) -> 1111 ^ 0010 -> 1101
i 번째 비트가 1인지 0인지 확인
set & 1 << (i - 1);
ex) 1100 & (1 << 2) -> 1100 & 0100 -> 0100 -> 결과값 != 0 -> i번째 비트가 1
코드
#include <cstdio>
#include <string>
using namespace std;
int main() {
int M; scanf("%d", &M);
int set = 0;
while (M--) {
char tmp[10]; scanf("%s", tmp);
string input = tmp;
if (input == "add") {
int num; scanf("%d", &num);
set |= (1 << (num - 1));
} else if (input == "remove") {
int num; scanf("%d", &num);
set &= ~(1 << (num - 1));
} else if (input == "check") {
int num; scanf("%d", &num);
printf("%d\n", set & (1 << (num - 1)) ? 1 : 0);
} else if (input == "toggle") {
int num; scanf("%d", &num);
set ^= (1 << (num - 1));
} else if (input == "all") {
set = 0xfffff;// 1111 1111 1111 1111 1111
} else if (input == "empty") {
set = 0; // 0000 0000 0000 0000 0000
}
}
}
'Algorithm > BOJ' 카테고리의 다른 글
백준[2098] 외판원 순회 (4) | 2021.07.03 |
---|---|
백준 [1311] 할 일 정하기 1 (0) | 2021.07.03 |
백준[1069] 집으로 (0) | 2021.07.01 |
백준[7869] 두 원 (0) | 2021.06.30 |
백준[2162] 선분 그룹 (0) | 2021.06.30 |