포스트

[수학] 시간 복잡도

[수학] 시간 복잡도

시간 복잡도 계산 및 계층별 정리

1. 시간 복잡도란?

시간 복잡도(Time Complexity) 는 입력 크기 n이 증가할 때, 알고리즘이 수행하는 기본 연산의 횟수를 수학적으로 표현한 것이다.


2. 시간 복잡도 계산 방법

2.1 반복문 기준 분석

  • 단일 반복문
    1
    
    for (int i = 0; i < n; i++) { ... } // O(n)
    
  • 중첩 반복문
    1
    2
    3
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) { ... }
    } // O(n^2)
    
  • 조건부 반복 (비대칭 반복)
    1
    2
    3
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i; j++) { ... }
    } // O(n(n-1)/2) => O(n^2)
    
  • 로그 반복
    1
    
    for (int i = 1; i < n; i *= 2) { ... } // O(log n)
    
  • 재귀 분할
    1
    
    T(n) = 2T(n/2) + O(n) // O(n log n)
    

3. 시간 복잡도 계층 및 예시

복잡도설명대표 예시해당 예 (예: 위 코드)
O(1)상수 시간단순 연산, 배열 접근없음
O(log n)로그 시간이진 탐색while(l < r) { mid = (l+r)/2; ... }
O(n)선형 시간배열 탐색, 단일 반복문for (int i = 0; i < n; i++)
O(n log n)로그 정렬merge sort, quick sortmergeSort(arr)
O(n^2)이중 반복문버블 정렬, 중첩 반복이중 for문
O(2^n)지수 시간부분 집합, 재귀 완전탐색dfs(pos+1), powerSet()
O(n!)팩토리얼순열 생성, TSPnext_permutation, permutation(dfs)

4. 실제 비교 (n이 커질수록 차이 커짐)

nO(1)O(log n)O(n)O(n log n)O(n^2)O(2^n)O(n!)
5125112532120
1013103310010243,628,800
201520864001,048,576약 2.4×10¹⁸

5. 위 코드 예시 위치 분석

1
2
3
4
5
for (int i = 0; i < n; i++){
    for (int j = 0; j < i; j++){
        a += i + j;
    }
}
  • 이 코드는 총 연산 횟수가 0 + 1 + 2 + ... + (n-1) = n(n-1)/2O(n^2)

6. 참고 정리: 시간 제한과 n의 범위

입력 범위 n허용 복잡도
n <= 10O(n!), O(2ⁿ) 가능
n <= 20~25O(2ⁿ) 가능
n <= 500O(n³) 이하
n <= 5,000O(n² log n) 이하
n <= 10⁵O(n log n) 이하
n <= 10⁷O(n) 이하
n <= 10⁸O(1), O(log n)만 가능 (1초 기준)

7. 요약

  • 시간 복잡도는 입력 크기 n에 대한 연산 횟수 추정이다.
  • 대표 복잡도 순서:
    O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(2^n) < O(n!)
  • 위 예시 코드는 O(n^2)에 해당하며, 이중 반복문에서 누적합 형태가 자주 이 복잡도를 유도함.
  • 시간 제한과 입력 크기를 고려해 알고리즘을 선택하는 것이 중요하다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.