코드
import sys
input = sys.stdin.readline
N = int(input())
s = 0b00000000000000000000
for _ in range(N):
l = input().split()
if len(l) > 1:
req, x = l
x = int(x)
else: req = l[0]
if req == 'add':
s = s | (1 << (20-x))
elif req == 'remove':
s = s & ~(1 << (20-x))
elif req == 'check':
ret = s & (1 << (20-x))
print(int(int(ret) > 0))
elif req == 'toggle':
s = s ^ (1 << (20-x))
elif req == 'empty':
s = 0b0000
elif req == 'all':
s = 0b11111111111111111111
결과
풀이 방법
- 배열이나 리스트로 접근하면 시간초과가 발생하는 문제이다
비트마스킹
을 사용하는 문제라고 한다. 파이썬에서는 숫자 앞에 0b를 붙여서 이진수를 표현한다.
- 이진수의 자릿수에 0 또는 1로 특정 원소의 유무를 표현하는 문제이다
- 원소 n의 유무를 n번째 자릿수에 표시하기 위해 1 << (20-n) 식을 사용하였다.