출처 : https://www.acmicpc.net/problem/11723
1. 문제 설명
비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오.
- add x: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.
- remove x: S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.
- check x: S에 x가 있으면 1을, 없으면 0을 출력한다. (1 ≤ x ≤ 20)
- toggle x: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
- all: S를 {1, 2, ..., 20} 으로 바꾼다.
- empty: S를 공집합으로 바꾼다.
2. 접근 방식
bitwise operator를 활용하는 법을 익히는 기본 문제 !
3. 주석 달기 (변수 설명, 각 줄마다 문장으로 설명, 함수 설명)
import sys
input = sys.stdin.readline
n = int(input())
s = 0
for _ in range(n):
command = input().rstrip()
if ' ' in command:
c, x = command.split()
x = int(x)
if command[0] == 'a':
# add x
s |= (1 << x)
elif command[0] == 'r':
# remove x
s &= ~(1 << x)
elif command[0] == 'c':
# check x
print(1 if s & (1 << x) else 0)
elif command[0] == 't':
# toggle x
s ^= (1 << x)
else:
# all
if command[0] == 'a':
s = (1 << 21) - 1
# empty
else:
s = 0
4. 분석 및 시간복잡도
아직 비트연산에 대한 시간 복잡도를 잘 모르겠다... 천천히 공부해보는걸로 .. 메모리도 무려 4MB 제한이라니