호기심 많은 분석가

[백준 11723] 집합 (Python) 본문

Coding/Coding Test & Algorithm

[백준 11723] 집합 (Python)

DA Hun 2021. 6. 8. 23:44
 

11723번: 집합

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

www.acmicpc.net

import sys
n = int(sys.stdin.readline().rstrip())
result = set()

for _ in range(n) :
    com = sys.stdin.readline().split()  
    if len(com)==1 :
        if com[0] == 'all' :
            result = set([k for k in range(1, 21)])
        else :
            result = set()
    else :
        cd, x = com[0], int(com[1])
        if cd == 'add' :
            result.add(x)
        elif cd == 'remove' :
            result.discard(x)
        elif cd == 'check' :
              print(1 if x in result else 0)
        elif cd == 'toggle' :
            if x in result :
                result.discard(x)
            else :
                result.add(x)

 문제 내용 자체는 어렵지 않았지만, 메모리 초과가 계속 발생해서 엄청 고생했다.

연산의 수가 3백만까지 가능하기에 list에 담기에는 너무 메모리가 부족했고 보다 나은 set을 사용하였다. set타입의 경우 원소를 삭제할 때 remove와 discard 모두 가능한데, discard의 경우 원소가 집합안에 없으면 그냥 실행하지 않는 차이점이 있다. remove보다 조금 더 간단하였고, 모든 방법을 다 동원하였는데 Pypy3에서는 메모리 초과가 계속 발생하여 Python3으로 실행해보니까 메모리 초과가 해결되었다. 

 다른 훌륭한 분의 코드를 보며 작업했는데 덕분에 메모리를 줄일 수 있는 여러 방법들을 배울 수 있었다. :)