Coding Test Practice/백준

백준 11723 파이썬

still..epochs 2022. 8. 25. 18:37

문제

비어있는 공집합 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 연산이 주어질때마다, 결과를 출력한다.

 

 

문제 풀이

그렇게 어렵지 않은 문제였지만 집합 set 의 원소를 삭제할 때, remove를 사용하면 런타임 에러가 발생하였고 discard를 사용할 때에는 정답으로 처리 되었다. 집합에서 remove와 discard의 차이는 다음과 같다

 

- remove(x) : x에 해당하는 원소 제거, 없다면 KeyError 발생

>>> k = {1, 2, 3}
>>> k.remove(3)
>>> k
{1, 2}
>>> k.remove(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 3

 

- discard(x) : x에 해당하는 원소 제거, 없어도 에러발생하지 않음

>>> k = {1, 2, 3}
>>> k.discard(3)
>>> k
{1, 2}
>>> k.discard(3)
>>> k
{1, 2}

 

이 점에 확인하고 다음과 같이 풀이하였다.

# 집합

import sys
m = int(sys.stdin.readline())
S = set()

for _ in range(m):
    order = sys.stdin.readline().split()

    if len(order) == 1:
        if order[0] == 'all':
            S = set([i for i in range(1,21)])
        else:
            S = set()
    
    else:
        order, num = order[0], order[1]
        num = int(num)

        if order == 'add':
            S.add(num)
        elif order =='remove':
            S.discard(num)
        elif order == 'check':
            print(1 if num in S else 0)
        elif order == 'toggle':
            if num in S:
              S.discard(num)
            else:
                S.add(num)

 

그렇게 어렵지 않은 문제였지만.. 런타임 에러가 너무 많이 나왔는데 원인을 못찾아서 고생했다 ㅎㅎ..

 

참고사이트

https://wikidocs.net/16044