티스토리 뷰
https://www.acmicpc.net/problem/11723
비트마스크를 이용해서 집합 연산을 하는 문제이다. 예를 들어 1을 원소로 가지고 있다면 10, 2를 가지고 있다면 100, 1~5를 가지고 있다면 111110이다. 시프트 연산자를 이용해서 다양한 연산을 할 수 있다.
add: x만큼 왼쪽으로 민 것과 OR 연산을 한다. 원소가 이미 존재하면 그대로 1일 것이고 없다면 1로 바뀌어서 추가된다.
remove: x만큼 왼쪽으로 민 것을 반전시켜주고 AND 연산을 한다. 그러면 삭제하고자 하는 위치는 무조건 0이 되고 나머지 부분은 유지된다.
check: x만큼 왼쪽으로 민 것과 AND 연산을 해서 그대로 유지되면 x가 있는 것이고 0이 되면 x가 없는 것이다.
toggle: x만큼 왼쪽으로 민 것과 XOR 연산을 하면 해당 부분은 0이면 1, 1이면 0으로 바뀌고 나머지 부분은 유지된다.
all: x+1만큼 왼쪽으로 밀고 1을 빼면 0~x까지 1로 채워진다.
empty: s를 0으로 바꾼다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <cstdio> #include <cstring> int main() { int m,x,s=0; scanf("%d",&m); while(m--) { char q[7]; scanf("%s",q); if(!strcmp(q,"add")) scanf("%d",&x),s|=(1<<x); else if(!strcmp(q,"remove")) scanf("%d",&x),s&=~(1<<x); else if(!strcmp(q,"check")) scanf("%d",&x),printf("%d\n",s&(1<<x)?1:0); else if(!strcmp(q,"toggle")) scanf("%d",&x),s^=(1<<x); else if(!strcmp(q,"all")) s=(1<<21)-1; else s=0; } return 0; } | cs |
'Algorithm > BOJ' 카테고리의 다른 글
1038 감소하는 수 (0) | 2018.09.20 |
---|---|
15971 두 로봇 (0) | 2018.09.16 |
2098 외판원 순회 (0) | 2018.09.13 |
1563 개근상 (0) | 2018.09.12 |
2224 명제 증명 (0) | 2018.09.12 |