Problem Solving/BOJ(백준)

[BOJ]백준 11723번: 집합/Bitmask

이진2 2021. 1. 18. 23:31

www.acmicpc.net/problem/11723

 

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)