1. Question
비어있는 공집합 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를 공집합으로 바꾼다.
1.1 Input
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.
둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
1.2 Output
check 연산이 주어질때마다, 결과를 출력한다.
1.3 Example
입력 |
출력 |
26 add 1 add 2 check 1 check 2 check 3 remove 2 check 1 check 2 toggle 3 check 1 check 2 check 3 check 4 all check 10 check 20 toggle 10 remove 20 check 10 check 20 empty check 1 toggle 1 check 1 toggle 1 check 1 |
1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 |
2. Approach
걍 집합문제인 줄알고 set으로 접근했다가 시간 초과로 털렸다.
알고보니 M이 300만이라 set으로 접근하면 안되고 bitwise하게 풀어야한다.
수의 범위가 20까지니까 20자리 2진수를 설정한다. 각 자리수의 True, False는 그 수가 현재 집합에 있는 지 없는지를 의미한다.
3. Submission
4. Code
import sys
rl = sys.stdin.readline
N = int(rl())
S = 0
for _ in range(N):
ins = rl().split()
if ins[0] == "add":
S |= (1 << int(ins[1]))
elif ins[0] == "remove":
S &= ~(1 << int(ins[1]))
elif ins[0] == "toggle":
S ^= (1 << int(ins[1]))
elif ins[0] == "all":
S = (1 << 21) - 1
elif ins[0] == "empty":
S = 0
else:
if S & (1 << int(ins[1])):
print(1)
else:
print(0)