티스토리 뷰

반응형

비트마스트를 배우는 단계에 있는 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
반응형
댓글