n이 커질 때 시간이 어떤 모양으로 늘어나는가 — 이것이 알고리즘의 진짜 성적표입니다.
개발자가 만든 상품 검색 기능이 있습니다. 테스트할 때는 0.01초. 완벽합니다.
그런데 오픈 6개월 뒤, 상품이 3만 개가 되자 5초가 걸립니다.
서버를 두 배 좋은 걸로 바꿨더니 2.5초. 여전히 느립니다.
무엇이 잘못된 걸까요? 서버가 부족한 게 아닙니다.
알고리즘이 잘못 골라진 것입니다.
비용을 재는 자 — 걸음 수
알고리즘의 비용은 초(second)로 재지 않습니다.
초는 컴퓨터 성능·네트워크·그날 서버 상태에 따라 매번 다르니까요.
대신 "데이터가 n개일 때 몇 걸음을 걷는가"를 셉니다.
이 걸음 수를 n에 대한 식으로 쓴 것이 시간 복잡도예요.
같은 1,000개 데이터인데 걸음 수가 1 vs 1,000 vs 500,000.
O(빅오) 표기법 — 큰 그림만 남기기
걸음 수가 3n + 7 이든 5n + 100 이든,
n이 100만이 되면 +7이나 +100은 아무 의미가 없습니다.
그래서 자잘한 것은 다 버리고 가장 크게 자라는 항만 남깁니다.
이 표기법이 O( ), "빅오"예요.
| 표기 | 이름 | 쇼핑몰에서의 예 | n=100만일 때 |
O(1) | 상수 | 주문번호로 딱 하나 조회 (해시) | 1번 |
O(log n) | 로그 | 정렬된 목록에서 이진 탐색 | 20번 |
O(n) | 선형 | 전체 매출 합산 | 100만 번 |
O(n log n) | 선형로그 | 상품 목록 정렬 | 2,000만 번 |
O(n²) | 제곱 | 모든 상품 쌍을 비교 | 1조 번 💀 |
맨 아래를 보세요. 1조 번입니다. 1초에 1억 번을 계산하는 컴퓨터라도
약 3시간이 걸립니다. 이래서 O(n²)은 실무에서 "터진다"고 말해요.
🎮 성장 곡선 실험실
말로만 들으면 감이 안 옵니다. 직접 재 봅시다.
아래 위젯은 여러분의 브라우저에서 실제로 코드를 돌려 시간을 측정합니다.
n을 2배씩 키우면서 시간이 몇 배로 늘어나는지 확인해 보세요.
최선 · 최악 · 평균
같은 알고리즘도 운에 따라 다릅니다.
창고 100칸을 앞에서부터 뒤지는 알고리즘을 생각해 보세요.
- 최선 — 찾는 물건이 1번 칸에 있음 → 1걸음
- 최악 — 마지막 칸에 있거나, 아예 없음 → 100걸음
- 평균 — 대체로 절반쯤 → 50걸음
실무에서 기준으로 삼는 것은 거의 항상 최악입니다.
"평균 0.1초"인 서비스라도 최악이 30초면 그 손님은 떠나니까요.
직접 측정해 보세요. n이 2배면 시간은 4배 — 그것이 O(n²)의 정체입니다.
🤔 확인 문제
상품 1,000개에서 0.5초 걸리던 O(n²) 알고리즘이 있습니다. 상품이 10,000개가 되면 대략 얼마나 걸릴까요?
해설 n이 10배가 되면 O(n²)은 10² = 100배가 됩니다. 0.5초 × 100 = 50초. 데이터가 10배 늘었을 뿐인데 서비스가 죽습니다.
🤔 확인 문제
다음 중 데이터가 100만 개일 때 가장 빠른 것은?
해설 O(log n)은 100만 개여도 약 20번이면 끝납니다. 정렬된 데이터에서 이진 탐색이 이 성능이에요 (5강).
🤔 확인 문제
시스템 관리자가 성능을 판단할 때 보통 기준으로 삼는 것은?
해설 평균이 좋아도 최악에서 30초 걸리는 서비스는 그 손님을 잃습니다. 그래서 O 표기법은 관행적으로 최악을 기준으로 말합니다.