19강 / 20강
시간 복잡도 — 데이터가 100배가 되면
빠르다·느리다를 말로 하지 않고 정확히 표현하는 법
지금까지 🐢와 ⚡ 로만 이야기했습니다. 이제 제대로 된 이름을 붙일 차례입니다.
Big-O 표기법은 "이 코드가 몇 초 걸리는가"가 아니라 "데이터가 늘어날 때 시간이 어떤 모양으로 늘어나는가"를 나타냅니다.
왜 초로 말하지 않을까요? 컴퓨터마다 다르니까요. 하지만 "데이터가 2배면 시간도 2배"라는 모양은 어떤 컴퓨터에서든 똑같습니다.
| 표기 | 이름 | n=10 | n=1,000 | n=1,000,000 | 예 |
|---|---|---|---|---|---|
| O(1) | 상수 | 1 | 1 | 1 | 리스트 인덱스, 딕셔너리 조회 |
| O(log n) | 로그 | 3 | 10 | 20 | 이진 탐색, 균형 트리 |
| O(n) | 선형 | 10 | 1,000 | 1,000,000 | 리스트 전체 훑기 |
| O(n log n) | 선형로그 | 33 | 10,000 | 20,000,000 | 병합·퀵 정렬 |
| O(n²) | 제곱 | 100 | 1,000,000 | 1조 | 버블 정렬, 이중 반복문 |
| O(2ⁿ) | 지수 | 1,024 | 천문학적 | 불가능 | 재귀 피보나치, 하노이 탑 |
1초에 1억 번 계산하는 컴퓨터라면, n=100만일 때 O(n)은 0.01초, O(n²)은 약 3시간입니다. 같은 문제, 같은 컴퓨터인데요.
🎮 복잡도 실험실
데이터 개수를 늘려 가며 실제 걸리는 시간을 재고 그래프를 그립니다. 표의 숫자가 아니라 곡선의 모양을 보세요.
Big-O 를 읽는 세 가지 규칙
- 가장 큰 항만 남긴다 —
n² + 100n + 5000→ O(n²)
n이 충분히 크면 n²이 나머지를 압도합니다. - 상수배는 무시한다 —
3n도100n도 O(n)
모양이 같으면 같은 등급입니다. 컴퓨터를 100배 빠른 걸로 바꾸는 것과 같은 효과니까요. - 최악의 경우를 말한다 — 운 좋으면 첫 칸에서 찾더라도 O(n)
④번이 함정입니다. 중첩 반복문이라고 무조건 n²이 아니에요.
Python
브라우저에서 실행
한 줄 고쳐 등급을 내리는 실전. 결과 개수는 같습니다.
Python
브라우저에서 실행
주요 연산의 복잡도 한눈에
| 자료구조 | 인덱스 접근 | 검색 | 맨 뒤 삽입 | 맨 앞 삽입 | 삭제 |
|---|---|---|---|---|---|
| 리스트 | O(1) | O(n) | O(1) | O(n) | O(n) |
| 연결 리스트 | O(n) | O(n) | O(1) | O(1) | O(1)* |
| deque | O(n) | O(n) | O(1) | O(1) | O(1)* |
| 딕셔너리 · 집합 | — | O(1) | O(1) | — | O(1) |
| 이진 탐색 트리(균형) | — | O(log n) | O(log n) | — | O(log n) |
| 힙 | — | O(n) | O(log n) | — | O(log n)** |
* 위치를 이미 알고 있을 때 ** 최솟값 삭제
이 표를 외울 필요는 없습니다. "무엇이 빠른 그릇인가"를 찾아보는 습관이면 충분해요.
🤔 확인 문제
3n² + 500n + 10000 의 시간 복잡도는?해설 가장 큰 항만 남기고 상수배는 버립니다. n이 커지면 n²이 나머지를 압도하고, 계수 3은 컴퓨터 성능 차이 정도의 의미밖에 없어요.
🤔 확인 문제
for ㅇ in 목록: if ㅇ in 다른리스트: 의 전체 복잡도는? (둘 다 크기 n)해설 바깥 반복이 n번, 안쪽
in 리스트가 매번 O(n)이므로 O(n²)입니다. 다른리스트를 집합으로 바꾸면 O(n)이 돼요.🤔 확인 문제
1초에 1억 번 계산하는 컴퓨터로 n=1,000,000 을 처리할 때, 실용적으로 불가능한 것은?
해설 O(n²)이면 1조 번 계산 = 약 3시간입니다. O(n log n)은 2천만 번 = 0.2초예요. 같은 문제, 같은 컴퓨터인데 알고리즘이 갈랐습니다.