시간복잡도에 대해서 알아보자! #빅오 표기법

시간복잡도란?

시간복잡도(Time Complexity)는 입력 데이터의 크기(n)에 따라 알고리즘이 수행하는 연산량을 나타낸 것입니다.

간단히 말해 "입력이 많아질수록 이 코드가 얼마나 느려질까?"를 수학적으로 표현하는 방법입니다.


Big O Notation (빅오 표기법)이란?

Big O 표기법은 알고리즘의 최악의 실행 시간을 나타내며, 다음과 같은 종류가 있습니다.


표기 설명 예시
O(1) 상수 시간 – 입력 크기에 관계 없음 배열에서 인덱스로 접근
O(log n) 로그 시간 – 이진 탐색처럼 반씩 줄이는 구조 이진 탐색
O(n) 선형 시간 – 입력이 커지면 비례해서 늘어남 전체 탐색
O(n log n) 대부분의 정렬 알고리즘 성능 병합정렬, 퀵정렬
O(n²) 이중 반복문 등 버블정렬, 삽입정렬
O(2ⁿ), O(n!) 매우 느림 – 완전탐색 순열, 조합

시간복잡도의 종류와 예시

 

O(1) – 상수 시간

var first = list[0]; // 인덱스로 바로 접근

아무리 데이터가 많아도 딱 한 번만 동작하니까 시간복잡도는 O(1)가 됩니다.


O(n) – 선형 시간

foreach (var item in list)
    Debug.Log(item);

리스트가 100개면 100번, 1000개면 1000번 반복하므로 O(n)가 됩니다.


O(n²) – 이중 반복

for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
        Debug.Log(i + ", " + j);

한 번에 n × n번이 되므로 O(n²)가 됩니다.


O(log n) – 로그 시간

int BinarySearch(int[] arr, int target)
{
    int left = 0, right = arr.Length - 1;
    while (left <= right)
    {
        int mid = (left + right) / 2;
        if (arr[mid] == target) return mid;
        else if (arr[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
    return -1;
}

반으로 줄여가며 검사 이진 탐색기법입니다.

매 반복마다 절반으로 줄여서 찾는 구조이므로 O(log n)이 됩니다.


O(n log n) – 정렬 알고리즘

Merge Sort, Quick Sort, Unity의 List.Sort()

정렬할 때 자주 나오는 알고리즘의 시간복잡도는 O(n log n)이 됩니다.


O(2ⁿ), O(n!)

void Fibonacci(int n)
{
    if (n <= 1) return;
    Fibonacci(n - 1);
    Fibonacci(n - 2);
}

완전탐색, 재귀 조합, 순열 계산 등은 n = 50 같은 수치를 넣으면 수천~수만 번 반복하기 때문에 매우 비효율적입니다.


비교 예시 (비슷한 코드, 다른 시간복잡도)

bool HasDuplicate(List<int> list)
{
    for (int i = 0; i < list.Count; i++)
        for (int j = i + 1; j < list.Count; j++)
            if (list[i] == list[j]) return true;
    return false;
}
bool HasDuplicate(List<int> list)
{
    HashSet<int> set = new();
    foreach (int num in list)
    {
        if (set.Contains(num)) return true;
        set.Add(num);
    }
    return false;
}

어떤 알고리즘이 더 시간복잡도가 작은지 고민해보시길 바랍니다 ㅎㅎ

 

정답은 맨 아래 두겠습니다!

 

 

 

 

 

 

위에 알고리즘은 O(n²), 아래 알고리즘은 O(n) 입니다.