알고리즘 분석 입문

알고리즘의 시간·공간 복잡도를 분석하는 방법과 최선·평균·최악 경우의 의미를 설명합니다.

· 6 min read · PALDYN Team

지난 글에서 알고리즘의 정의와 좋은 알고리즘의 5가지 조건을 살펴봤습니다. 이제 두 알고리즘 중 어떤 것이 더 나은지 판단하는 기준인 알고리즘 분석으로 넘어갑니다.

왜 알고리즘을 분석하는가

같은 문제를 해결하는 알고리즘이라도 실행 시간과 메모리 사용량이 크게 다를 수 있습니다. 직접 실행해서 비교할 수도 있지만, 이 방법은 컴퓨터 성능·언어·입력 데이터에 따라 결과가 달라지기 때문에 신뢰하기 어렵습니다. 그래서 수학적으로 알고리즘의 효율성을 측정하는 방법이 필요합니다.

시간 복잡도와 공간 복잡도

알고리즘 분석의 두 가지 핵심 지표입니다.

  • 시간 복잡도(Time Complexity): 입력 크기 n에 따라 알고리즘이 수행하는 기본 연산(비교, 대입, 산술 등)의 횟수
  • 공간 복잡도(Space Complexity): 알고리즘이 실행되는 동안 사용하는 메모리 용량

둘 다 입력 크기 n의 함수로 표현됩니다. 현대에는 메모리가 저렴해져 시간 복잡도를 더 중시하는 경향이 있습니다.

주요 시간 복잡도 성장률 비교

분석의 3가지 경우

같은 알고리즘이라도 입력 데이터에 따라 수행 횟수가 달라집니다. 그래서 세 가지 경우를 나눠 분석합니다.

알고리즘 분석의 3가지 경우

최선 경우 (Best Case) — Ω(n)

가장 유리한 입력이 주어졌을 때의 성능입니다. 선형 탐색에서 첫 번째 원소가 바로 목표인 경우처럼 단 1번의 비교로 끝나는 상황입니다. 하한(Lower bound)을 나타냅니다.

평균 경우 (Average Case) — Θ(n)

가능한 모든 입력에 대한 기대 성능입니다. 확률 분포를 가정해야 해서 분석이 복잡하지만, 실제 사용 환경에 가장 근접합니다. 선형 탐색의 평균은 n/2번 비교입니다.

최악 경우 (Worst Case) — O(n)

가장 불리한 입력이 주어졌을 때의 성능입니다. 선형 탐색에서 목표가 마지막 원소이거나 없는 경우 n번 비교가 필요합니다. 실무에서 가장 중요합니다. 최악의 경우가 보장되어야 시스템이 안정적으로 동작하기 때문입니다.

기본 연산 카운팅

알고리즘 분석의 첫 단계는 지배적인 연산을 세는 것입니다.

def sum_array(arr):
    total = 0           # 대입 1번
    for i in range(len(arr)):
        total += arr[i] # 덧셈 + 대입 = 2번, n회 반복
    return total        # 반환 1번
# 총 연산: 1 + 2n + 1 = 2n + 2

여기서 상수 2와 상수 2는 n이 충분히 클 때 의미가 작아집니다. 중요한 것은 n에 비례해 증가한다는 사실, 즉 선형(linear) 성장이라는 점입니다.

점근적 분석의 필요성

입력 크기가 작을 때는 어떤 알고리즘도 충분히 빠릅니다. 중요한 것은 n이 커질 때의 행동입니다.

nO(log n)O(n)O(n log n)O(n²)
1031033100
1,000101,00010,0001,000,000
1,000,000201,000,00020,000,00010¹²

n=1,000,000에서 O(n²)는 현대 컴퓨터(초당 10⁹ 연산 기준)로 약 16분이 걸리지만 O(log n)은 즉시 처리됩니다.

# 두 중첩 루프: O(n²)
def naive_pairs(n):
    count = 0
    for i in range(n):       # n번
        for j in range(n):   # n번
            count += 1
    return count  # 총 n² 번

# 수학 공식 활용: O(1)
def smart_pairs(n):
    return n * n  # 상수 시간

분석 시 주의사항

  • 숨겨진 복잡도: 내장 함수(예: list.sort())도 복잡도가 있습니다. O(n log n)
  • 입력 크기 정의: 배열의 경우 원소 수, 문자열의 경우 글자 수, 그래프는 정점 수 + 간선 수
  • 상수 인자 무시: 실제 성능에서는 상수가 중요할 수 있지만, 점근 분석에서는 무시

정리

  • 알고리즘 분석 = 입력 크기 n에 대한 연산 횟수 함수 도출
  • 시간 복잡도(연산 횟수) vs 공간 복잡도(메모리)
  • 최선/평균/최악 경우 — 실무에서는 최악 경우 위주 분석
  • 점근적 분석: n이 충분히 클 때의 성장률만 본다

지난 글: 알고리즘이란 무엇인가

다음 글: 시간·공간 복잡도


읽어주셔서 감사합니다. 😊