1. 몇 번 반복하나
루프, 재귀, 호출 횟수를 입력 크기 기준으로 먼저 고정한다.
복잡도 오판은 보통 “탐색은 빠르다”에서 멈출 때 생긴다. 한 줄의 코드도 반복 횟수, 연산 단가, 보조 공간, 최악 입력을 함께 적어야 상한이 맞는다.
루프, 재귀, 호출 횟수를 입력 크기 기준으로 먼저 고정한다.
삽입, 복사, 해시 버킷, 재귀 스택처럼 숨은 비용을 더한다.
해시 충돌, 깊은 재귀, 역정렬 입력은 평균식을 깨뜨린다.
최종 식을 제한 크기와 메모리 한도에 연결해 판단한다.
| 코드 신호 | 숨은 비용 | 상한을 바꾸는 질문 | 판정 |
|---|---|---|---|
중간 삽입list.insert(pos, x)
|
뒤 원소 이동 때문에 삽입 한 번이 O(N)이다. | 이진 탐색으로 위치를 빨리 찾아도 이동 비용은 남는가? | 전체 루프와 합치면 O(N²) 가능성이 크다. |
복사arr[:mid]
|
길이 K만큼 시간과 새 버퍼 O(K)가 생긴다. | 재귀 호출마다 새 배열을 만들고 있지는 않은가? | 점화식과 순간 메모리 피크를 함께 계산한다. |
재귀dfs(node)
|
시간은 O(V+E), 스택은 깊이에 비례한다. | 그래프가 깊게 이어지면 호출 한계를 넘지 않는가? | 시간 통과와 별개로 공간 실패를 점검한다. |
해시set.add / in
|
평균은 빠르지만 키 저장공간은 O(N)이다. | 입력 분포와 충돌 가능성을 문제 조건이 보장하는가? | 평균 O(1)과 최악 케이스를 분리해 적는다. |
핵심: 복잡도는 코드 줄 수가 아니라 반복 횟수 × 연산 단가 + 보조 공간의 피크로 판정한다.