백준-11723-집합
업데이트:
문제
풀이
문제조건 해석
집합의 원소개수가 크지 않을 때, 집합을 표현하고 연산하는 문제
- BitMask 문제
알고리즘
비트마스크 문제이나, 집합을 정수로 표현해서 비트 연산하면 시간초과 난다.(Python의 경우)
따라서 집합 원소수만큼의 길이를 가진 배열을 선언하고, 각 원소를 비트값으로 생각하여 구현하여야 한다.
코드
# 비트 연산 이용 -> 시간초과
from sys import stdin
input = stdin.readline
s = 0
m = int(input().rstrip())
for _ in range(m):
op = input().rstrip().split()
if op[0] == 'add':
s |= 2**int(op[1])
elif op[0] == 'remove':
s &= ~2**int(op[1])
elif op[0] == 'check':
if s & 2**int(op[1]):
print(1)
else:
print(0)
elif op[0] == 'toggle':
s ^= 2**int(op[1])
elif op[0] == 'all':
s = 0
for i in range(1, 21):
s += 2**i
else:
s = 0
# 비트를 나타내는 배열 이용
from sys import stdin
input = stdin.readline
s = [False for _ in range(21)]
m = int(input().rstrip())
for _ in range(m):
op = input().rstrip().split()
if op[0] == 'add':
s[int(op[1])] = True
elif op[0] == 'remove':
s[int(op[1])] = False
elif op[0] == 'check':
if s[int(op[1])]:
print(1)
else:
print(0)
elif op[0] == 'toggle':
if s[int(op[1])]:
s[int(op[1])] = False
else:
s[int(op[1])] = True
elif op[0] == 'all':
s = [True for _ in range(21)]
else:
s = [False for _ in range(21)]
배운점
- 비트마스크는 집합을 표현하기에 효율적
- 단, 집합의 원소수가 많거나
- 원소수가 제한되어 있지 않을때는 사용하기 어렵다.
댓글남기기