collections 모듈에는 효율적인 자료구조들이 많아서 코딩테스트에서 자주 쓰여!
아래 기능들을 잘 익혀두면 문제 풀이 속도를 크게 줄일 수 있습니다.
문자열 또는 리스트에서 빈도수를 쉽게 계산
✅ 사용법:
코드 복사
from collections import Counter
s = "banana"
count = Counter(s) # 각 문자 개수 세기
print(count) # Counter({'a': 3, 'n': 2, 'b': 1})
print(count['a']) # 3
print(count['z']) # 0 (없는 키는 0 반환)
print(count.most_common(2)) # [('a', 3), ('n', 2)]
📌 활용:
문자 빈도수 계산 (예: 한 번만 등장하는 문자 찾기)
가장 많이 등장한 요소 찾기 (most_common())
리스트 숫자 빈도수 체크
양쪽에서 빠르게 삽입/삭제가 가능한 큐
✅ 사용법:
코드 복사
from collections import deque
q = deque([1, 2, 3])
q.append(4) # 오른쪽 삽입
q.appendleft(0) # 왼쪽 삽입
print(q) # deque([0, 1, 2, 3, 4])
q.pop() # 오른쪽 삭제
q.popleft() # 왼쪽 삭제
print(q) # deque([1, 2, 3])
📌 활용:
BFS (너비 우선 탐색)에서 빠른 큐 구현
슬라이딩 윈도우 최적화 (고정 크기 유지)
앞뒤에서 삽입/삭제가 많은 경우 리스트보다 빠름
존재하지 않는 키에 대한 기본값을 자동으로 생성하는 딕셔너리
✅ 사용법:
코드 복사
from collections import defaultdict
d = defaultdict(int)
d['a'] += 1
print(d) # defaultdict(<class 'int'>, {'a': 1})
d = defaultdict(list)
d['a'].append(10)
print(d) # defaultdict(<class 'list'>, {'a': [10]})
📌 활용:
키가 없는 경우 기본값을 자동 설정
해시맵을 사용할 때 유용 (예: 그래프 인접 리스트 생성)
리스트, 정수, 집합 등의 기본값을 쉽게 관리 가능
딕셔너리에 삽입한 순서를 유지
✅ 사용법:
from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(list(od.keys())) # ['a', 'b', 'c']
print(list(od.values())) # [1, 2, 3]
📌 활용:
파이썬 3.7 이상에서는 일반 dict도 순서를 유지하지만, OrderedDict는 명확히 순서가 필요한 경우 유용
삽입 순서를 유지하는 캐시 구현 가능
딕셔너리보다 메모리 효율적이고, 속성처럼 접근 가능한 튜플
✅ 사용법:
from collections import namedtuple
Person = namedtuple('Person', ['name', 'age'])
p = Person(name="Alice", age=25)
print(p.name) # Alice
print(p.age) # 25
📌 활용:
객체처럼 사용할 수 있는 가벼운 구조체
튜플보다 가독성이 좋고, dict보다 메모리 절약 가능
간단한 데이터 저장용 클래스 대신 사용 가능