Problem Solving/BOJ(백준)
[BOJ]백준 11723번: 집합/Bitmask
이진2
2021. 1. 18. 23:31
11723번: 집합
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
www.acmicpc.net
수업 때 비트마스킹 언급된 기념으로 풀어본 비트마스킹 문제
비트 연산을 연습해볼 수 있는 좋은 문제였다 !!
1️⃣ 특정 bit(n bit)을 1로 바꾸고 싶을 때
bit |= (1<<n)
2️⃣ 특정 bit(n bit)을 0으로 바꾸고 싶을 때
bit &= ~(1<<n)
3️⃣ 특정 bit(n bit)을 toggle하고 싶을 때(1은 0으로, 0은 1로)
bit ^= (1<<n)
4️⃣ 모든 bit을 1로 바꾸고 싶을 때
bit |= (1<<n+1) - 1
5️⃣ 모든 bit을 0으로 바꾸고 싶을 때
bit &= 0
위의 다섯 가지 연산을 활용해주면 끝 ~~
import sys
m=int(sys.stdin.readline().strip())
bit=0
while m!=0:
a=sys.stdin.readline().strip()
m-=1
if a=='all':
bit=(1<<21)-1
continue
elif a=='empty':
bit=0
continue
a,b=map(str,a.split(" "))
b=int(b)
if a=='add':
bit|=(1<<b)
elif a=='remove':
bit&=~(1<<b)
elif a=='check':
print('1' if (bit>>b)&1==1 else '0')
elif a=='toggle':
bit^=(1<<b)