비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오.
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.
둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
check 연산이 주어질때마다, 결과를 출력한다.
import sys
input = sys.stdin.readline
m = int(input())
S = set()
for _ in range(m):
c = input().split()
if c[0] == 'add':
if int(c[1]) in S:
pass
else:
S.add(int(c[1]))
elif c[0] == 'remove':
if int(c[1]) not in S:
pass
else:
S.discard(int(c[1]))
elif c[0] == 'check':
if int(c[1]) in S:
print(1)
else:
print(0)
elif c[0] == 'toggle':
if int(c[1]) in S:
S.discard(int(c[1]))
else:
S.add(int(c[1]))
elif c[0] == 'all':
S = set([x+1 for x in range(20)])
elif c[0] == 'empty':
S = set()
처음에는 리스트를 이용해서 풀었다가 시간 초과 및 메모리 초과로 철퇴를 맞았다...실버로 올라오면 (파이썬의 경우는 특히) 웬만하면 리스트 말고 다른 자료형을 사용하거나 보다 효율적인 구현 방법을 많이 고민해야 하는 것 같다.
다른 풀이를 찾아보니 set을 이용해서 풀었길래 set으로 풀었더니 시간 초과나 메모리 초과 없이 정답을 받을 수 있었다. set 자료형의 메서드 add
와 discard
를 기억하자.
https://www.acmicpc.net/problem/11723
https://yoonsang-it.tistory.com/38