11723번: 집합

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

www.acmicpc.net

비어있는 공집합 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 = set()

def add(x):
    global s
    if x in s:
        return
    else:
        s.add(x)

def remove(x):
    global s
    if not x in s:
        return
    else:
        s.remove(x)

def check(x):
    global s
    if x in s:
        print(1)
    else:
        print(0)

def toggle(x):
    global s
    if x in s:
        s.remove(x)
    else:
        s.add(x)

for _ in range(n):
    temp = input().split()
    if len(temp) == 1:
        if temp[0] == "all":
            s = set(range(1, 21))
        else:
            s.clear()

    else:
        op, x = temp[0], temp[1]
        if op == "add":
            add(int(x))
        elif op == "remove":
            remove(int(x))
        elif op == "check":
            check(int(x))
        elif op == "toggle":
            toggle(int(x))

 

실수했던 부분

입력으로 받은 문자열을 비교하는 부분에서

temp == "all" 로 작성했다.

temp는 input().split() 을 통해 문자열을 분할한 리스트이기 때문에

문자열을 비교할 때는 temp[0] == "all"로 비교해야 한다.

 

remove 대신 discard를 써도 된다.

remove함수는 존재하지 않는 수를 제거하려고 하면 오류를 발생하지만

discard함수를 사용하면 오류 없이 정상적으로 종료된다.

+ Recent posts