반응형
비트마스트를 배우는 단계에 있는 1번 문제 이다.
배워야하는 점은 연산하는 개수와 인풋을 하는 개수의 중요성을 알아야 맞출 수 있는 문제라는 점이다.
예전에는 푸는 사람을 괴롭히려고 이런 문제가 있는 줄 알았는데, 요즘은 다루는 상품의 개수가 많을때를 대비한 문제인것같아 뭔가 이해가 간다.
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000) 이고, 추가하는 x의 수가 21이기 때문에 생각을 잘해서 카운팅 정렬을 사용하여 풀었다.
다음 문제부터 비트 연산자를 꼭 쓰는 것으로..
백준은 일단 시간 초과 부분에서는 pypy3 를 권장하고 메모리 측면에서는 python3 가 좋다는 것을 알게된 문제
문제
비어있는 공집합 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를 공집합으로 바꾼다.
입력
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.
둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
출력
check 연산이 주어질때마다, 결과를 출력한다.
import sys
input = sys.stdin.readline
n = int(input())
s=[0] *21
for i in range(n):
command=list(input().split())
if len(command)>1:
command[1] = int(command[1])
if command[0] =='add':
s[command[1]]=1
elif command[0] =='remove':
s[command[1]]=0
elif command[0] =='check':
print(int(s[command[1]]==1))
elif command[0] =='toggle':
s[command[1]]=1-s[command[1]]
else:
if command[0] =='all':
s=[1]*21
elif command[0] =='empty':
s=[0]*21
반응형
'알고리즘' 카테고리의 다른 글
백준 2579번 계단 오르기 파이썬 :dp (0) | 2020.12.07 |
---|---|
비트 마스크 (0) | 2020.12.05 |
백준 2003번 수들의 합 2 파이썬 :투 포인터 문제 (0) | 2020.12.05 |
백준 2751번 수 정렬하기 2 (0) | 2020.12.04 |
백준 10989번 수 정렬하기 3 (0) | 2020.12.04 |