문제
비어있는 공집합 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)
그렇게 어렵지 않은 문제였지만.. 런타임 에러가 너무 많이 나왔는데 원인을 못찾아서 고생했다 ㅎㅎ..
참고사이트
'Coding Test Practice > 백준' 카테고리의 다른 글
백준 4948, 베르트랑 공준, python (2) | 2022.11.22 |
---|---|
백준 11659 파이썬, 구간 합 구하기 4, python (0) | 2022.10.19 |
백준 1620 파이썬, python 풀이 (0) | 2022.08.28 |
백준 1676 파이썬, 팩토리얼 0의 개수 (0) | 2022.08.23 |
백준 9012, 괄호, 파이썬 (0) | 2022.07.23 |