빅오 표기법(Big-O Notation)
입력 크기 N이 커질 때, 알고리즘의 성능(시간/공간)이 어떻게 증가하는지를 수학적으로 표기한 표기법
O(1) | 상수 시간 : 입력 크기와 무관 |
O(logN) | 로그 시간 : 이진 탐색 |
O(N) | 입력 크기만큼 순회 |
O(NlogN) | 병합 정렬, 퀵 정렬 |
O(N^2) | 중첩 반복문(이중 for문) |
O(2^N) | 재귀적 완전탐색(DFS, 백트래킹) 등 |
O(N!) | 순열/조합 모든 경우 |
시간 복잡도
입력 크기(N)이 증가할 때 걸리는 시간의 증가 정도
공간 복잡도
입력 크기(N)이 증가할 때 추가로 사용하는 메모리 크기
1초 시간 제한일 때, 얼마나 많은 연산을 처리할 수 있는가?
일반적인 기준
1초 | 약 10^7 ~ 10^8 (1천만 ~ 1억 번 연산) |
2초 | 약 2 x 10^7 ~ 2 x 10^8 (2천만 ~ 2억 번 연산) |
시간복잡도 기준 예시
입력 크기 N | 가능한 시간 복잡도(1초 기준) | 적용 예시 |
N ≤ 10 | O(N!) 또는 O(2^N) 가능 | 완점탐색(브루트포스), 백트래킹, 순열/조합, DFS/BFS |
N ≤ 100 | O(N^3) 이하 가능 | 플로이드-워셜, 3중for문 탐색, 그리디+탐색 |
N ≤ 1,000 | O(N^2) 가능 | DP(2차원), 이중 반복문, 기본 정렬(버블,삽입) |
N ≤ 10^4(1만) | O(NlogN) 이하 가능 | 병합 정렬, 퀵 정렬, 세그먼트 트리(쿼리 문제), 이분 탐색, 힙 |
N ≤ 10^5(10만) | O(NlogN) 이하 필수 | 정렬 기반 문제, 투 포인터, 슬라이딩 윈도우, 해시맵, 트리 구조, 유니온 파인드 |
N ≤ 10^6(100만) | O(N) 이하만 가능 | 카운팅 정렬, 누적합, 구간합, 소수 구하기(에라토스테네스의 체), 해시셋, 딕셔너리 |
N ≥ 10^7(1000만) | O(1) 또는 O(logN)만 가능 | 이분 탐색, 수학적 접근, 누적값의 규칙 분석 |
시간복잡도를 이용해 어떻게 판단해야하는가?
1.
입력 크기별로 필요한 시간복잡도 감 잡기
a.
대략 이 입력엔 어떤 알고리즘이 필요하겠다
2.
대표적인 알고리즘의 시간복잡도 기억하기
•
정렬 : O(NlogN)
•
이분 탐색 : O(logN)
•
DFS/BFS(노드 수 V, 간선 수 E) : O(V + E)
•
DP : 보통 O(N) or O(N^2)
•
해시/딕셔너리 탐색 : O(1)
•
에라토스테네스의 체 : O(N log log N)
•
순열/조합 : O(N!), O(2^N)
3.
실전에서 시간 제한으로 판단하는 감각 익히기
a.
입력 크기가 이 정도 → 이 정도 시간 복잡도 이하로 풀어야겠다
