Home

[백준][11723][실버5] 집합

Created
2025/02/03 16:24
import sys input = sys.stdin.readline m = int(input()) s = set() for i in range(m): cmd = str(input()) if 'all' in cmd: s = set([_ for _ in range(1, 21)]) elif 'empty' in cmd: s = set() else: op, x = cmd.split(' ') x = int(x) if 'add' == op: s.add(x) elif 'remove' == op: s.discard(x) elif "check" == op: if x in s: print(1) else: print(0) elif "toggle" == op: if x in s: s.discard(x) else: s.add(x)
Python
복사

파이썬 메모리 관리

정리

일반적으로, set은 list보다 더 많은 메모리를 사용한다.
집합 문제에서는 입력된 값(원소)가 있는지 없는지 확인하는 게 핵심이다. 따라서 x in s 같은 연산이 자주 사용된다.
list 는 각 원소를 연속된 메모리 블록에 저장한다.
set 은 해시 테이블 기반의 자료구조고, 원소를 해시값을 이용해 저장한다. 따라서 중복을 허용하지 않고, 중복 검사를 자동으로 수행한다.
in 연산의 경우, list 에서는 선형 탐색으로 O(n) , set 에서는 해시 기반으로 (1) 이 된다.
⇒ 따라서, in 연산을 계속해서 사용하는 집합 문제에서는 set 의 성능이 압도적으로 좋다.
'all' in cmd: ← 경우에 따라서는 이런 연산도 성능 저하에 영향을 준다. 위 내용을 알았다면 처음부터 split() 으로 인풋을 받아서 사용했을 것이다.