19강 / 20강

시간 복잡도 — 데이터가 100배가 되면

빠르다·느리다를 말로 하지 않고 정확히 표현하는 법

시간 복잡도 — 데이터가 100배가 되면
Big-O는 데이터가 늘어날 때 시간이 어떻게 늘어나는가를 나타냅니다.

지금까지 🐢와 ⚡ 로만 이야기했습니다. 이제 제대로 된 이름을 붙일 차례입니다.

Big-O 표기법은 "이 코드가 몇 초 걸리는가"가 아니라 "데이터가 늘어날 때 시간이 어떤 모양으로 늘어나는가"를 나타냅니다.

왜 초로 말하지 않을까요? 컴퓨터마다 다르니까요. 하지만 "데이터가 2배면 시간도 2배"라는 모양은 어떤 컴퓨터에서든 똑같습니다.

표기이름n=10n=1,000n=1,000,000예
O(1)상수111리스트 인덱스, 딕셔너리 조회
O(log n)로그31020이진 탐색, 균형 트리
O(n)선형101,0001,000,000리스트 전체 훑기
O(n log n)선형로그3310,00020,000,000병합·퀵 정렬
O(n²)제곱1001,000,0001조버블 정렬, 이중 반복문
O(2ⁿ)지수1,024천문학적불가능재귀 피보나치, 하노이 탑

1초에 1억 번 계산하는 컴퓨터라면, n=100만일 때 O(n)은 0.01초, O(n²)은 약 3시간입니다. 같은 문제, 같은 컴퓨터인데요.

🎮 복잡도 실험실

데이터 개수를 늘려 가며 실제 걸리는 시간을 재고 그래프를 그립니다. 표의 숫자가 아니라 곡선의 모양을 보세요.

복잡도 실험실 — n을 늘리며 실제 시간을 재고 곡선을 그립니다
불러오는 중…

Big-O 를 읽는 세 가지 규칙

  1. 가장 큰 항만 남긴다 — n² + 100n + 5000 → O(n²)
    n이 충분히 크면 n²이 나머지를 압도합니다.
  2. 상수배는 무시한다 — 3n 도 100n 도 O(n)
    모양이 같으면 같은 등급입니다. 컴퓨터를 100배 빠른 걸로 바꾸는 것과 같은 효과니까요.
  3. 최악의 경우를 말한다 — 운 좋으면 첫 칸에서 찾더라도 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)*
dequeO(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 의 시간 복잡도는?
🤔 확인 문제
for ㅇ in 목록: if ㅇ in 다른리스트: 의 전체 복잡도는? (둘 다 크기 n)
🤔 확인 문제
1초에 1억 번 계산하는 컴퓨터로 n=1,000,000 을 처리할 때, 실용적으로 불가능한 것은?