9. 내장 함수 — 더 나아가기

기본 내장 함수에 익숙해졌다면, 표준 라이브러리 모듈들도 알아두면 좋아요. 코테에서 자주 등장하는 강력한 도구들입니다.

heapq — 최소 힙(우선순위 큐)

항상 최솟값을 O(log n)에 꺼낼 수 있는 자료구조예요. 다익스트라나 우선순위가 필요한 문제에 필수입니다.

from heapq import heappush, heappop, heapify

nums = [3, 1, 2]
heapify(nums)            # 리스트를 힙 구조로 변환 (제자리)
print(heappop(nums))     # 출력: 1    (항상 최솟값을 꺼냄)

h = []
heappush(h, 5)           # 힙에 값 추가
heappush(h, 1)
heappush(h, 3)
print(heappop(h))        # 출력: 1

최대 힙이 필요하면 부호를 반전해서 넣고 꺼낼 때 다시 반전하는 트릭을 씁니다.

from heapq import heappush, heappop

max_h = []
for x in [3, 1, 4, 1, 5]:
    heappush(max_h, -x)  # 음수로 넣기
print(-heappop(max_h))   # 출력: 5    (꺼낼 때 다시 부호 반전 → 최댓값)

bisect — 정렬된 리스트에서 이분탐색

정렬 상태를 유지하면서 값이 들어갈 삽입 위치를 O(log n)에 찾아줍니다.

from bisect import bisect_left, bisect_right

a = [1, 2, 4, 4, 5]
print(bisect_left(a, 4))   # 출력: 2    (4가 들어갈 가장 왼쪽 위치)
print(bisect_right(a, 4))  # 출력: 4    (4가 들어갈 가장 오른쪽 위치)
print(bisect_left(a, 3))   # 출력: 2    (없는 값이면 삽입될 자리)

functools.reduce — 누적 연산

리스트를 왼쪽부터 하나로 접어가며 누적 계산해요.

from functools import reduce

print(reduce(lambda a, b: a * b, [1, 2, 3, 4]))  # 출력: 24   (1*2*3*4)
print(reduce(lambda a, b: a + b, [1, 2, 3, 4]))  # 출력: 10   (합도 가능)

math — 유용한 수학 함수

import math

print(math.gcd(12, 18))   # 출력: 6      (최대공약수)
print(math.ceil(3.2))     # 출력: 4      (올림)
print(math.floor(3.8))    # 출력: 3      (내림)
print(math.inf)           # 출력: inf    (무한대, 최솟값 비교 초기값으로 편해요)

sorted 다중 key — 여러 기준으로 정렬

key에 튜플을 주면 앞쪽 기준부터 차례로 비교합니다. 값 앞에 -를 붙이면 그 항목만 내림차순이 돼요.

data = [('a', 3), ('b', 1), ('c', 3), ('d', 2)]
# 두 번째 값 내림차순, 같으면 첫 번째 값 오름차순
print(sorted(data, key=lambda x: (-x[1], x[0])))
# 출력: [('a', 3), ('c', 3), ('d', 2), ('b', 1)]

💡 heapq(최솟값 빠르게), bisect(정렬된 곳에서 위치 찾기)는 O(log n)이라 큰 입력에서 시간 초과를 막아줍니다. math.inf는 최소·최대를 갱신하는 초기값으로, 다중 key 정렬은 복잡한 우선순위를 한 줄로 깔끔하게 처리해줘요.