// education

01. 알고리즘 성능 분석 기초 - 시간 복잡도, 공간 복잡도 및 Big-O 표기법

프로그램의 입력 크기 $N$이 증가함에 따라 연산 횟수와 메모리 사용량이 어떻게 변화하는지 분석하는 **시간 복잡도(Time Complexity)**와 **공간 복잡도(Space Complexity)**를 다룹니다.


1. 알고리즘 복잡도 핵심 용어 사전 (Glossary)


2. 주요 Big-O 복잡도 순위 및 허용 입력 크기 ($N$)

O(1) < O(log N) < O(N) < O(N log N) < O(N^2) < O(2^N) < O(N!)
[빠름 / 효율적] -----------------------------------> [느림 / 비효율적]
Big-O 표기 대표 알고리즘 예시 1초 내 실행 가능한 최대 입력 크기 ($N$)
$O(1)$ 배열 인덱스 접근, 해시 테이블 조회 무제한
$O(log N)$ 이분 탐색(Binary Search), 이진 탐색 트리 $N le 10^{18}$ (매우 큼)
$O(N)$ 선형 탐색, 1차원 배열 순회 $N le 20,000,000$ (약 2,000만)
$O(N log N)$ 퀵 정렬, 병합 정렬, 우선순위 큐 힙 $N le 1,000,000$ (약 100만)
$O(N^2)$ 이중 루프, 버블/선택/삽입 정렬, 플로이드-워셜 $N le 5,000$ ~ $10,000$
$O(2^N)$ 재귀적 피보나치, 부분집합 완전 탐색 $N le 20$ ~ $25$
$O(N!)$ 외판원 순회 완전 탐색(TSP), 순열 생성 $N le 10$ ~ $12$

4. 실전 파이썬(Python 3) 알고리즘 구현 코드 및 라인별 주석 해설

본 레슨의 핵심 연산 매커니즘을 파이썬 3 환경에서 가장 효율적이고 직관적으로 구현한 실전 소스 코드입니다. 모든 주요 라인마다 상세한 한글 주석이 기재되어 있어 코드의 흐름을 쉽고 명확하게 이해할 수 있습니다.

import time

def measure_time(func, *args):
    """함수의 실행 시간을 정밀 측정하는 헬퍼 함수"""
    start_time = time.perf_counter()  # 시작 고해상도 타이머 측정
    result = func(*args)              # 대상 알고리즘 함수 실행
    end_time = time.perf_counter()    # 종료 고해상도 타이머 측정
    # 밀리초(ms) 단위로 측정 결과 출력
    print(f"[{func.__name__:12s}] 실행 시간: {(end_time - start_time) * 1000:.4f} ms")
    return result

# 1. O(1) - Constant Time (상수 시간 복잡도)
def o_constant(arr: list):
    # 입력 리스트 크기 N과 무관하게 첫 번째 인덱스 요소 즉시 반환 (단 1회 연산)
    return arr[0] if arr else None

# 2. O(N) - Linear Time (선형 시간 복잡도)
def o_linear(arr: list):
    total = 0
    # 입력 리스트의 N개 원소를 단일 루프로 1회씩 모두 방문 (N회 연산)
    for num in arr:
        total += num
    return total

# 3. O(N^2) - Quadratic Time (2차 시간 복잡도)
def o_quadratic(arr: list):
    count = 0
    n = len(arr)
    # 이중 루프를 통해 N x N 번 모든 원소의 쌍을 교차 연산 (N^2회 연산)
    for i in range(n):
        for j in range(n):
            count += arr[i] * arr[j]
    return count

if __name__ == "__main__":
    # N = 1,000 개의 정수 리스트 생성
    data = list(range(1000))
    print("=== 알고리즘 복잡도별 실행 시간 비교 (N = 1,000) ===")
    measure_time(o_constant, data)
    measure_time(o_linear, data)
    measure_time(o_quadratic, data)

파이썬 소스 코드 핵심 포인트 해설

  1. # 주석: 파이썬 코드의 작동 원리를 직관적으로 이해할 수 있도록 기능별 상세 설명 주석을 첨부했습니다.
  2. time.perf_counter(): 파이썬에서 알고리즘의 정밀한 실행 시간을 측정하는 표준 고해상도 타이머입니다.
  3. o_constant: 리스트의 인덱스 접근은 입력 크기와 상관없이 $O(1)$의 상수 시간이 걸립니다.
  4. o_linear: 1차원 리스트를 1회 순회하므로 $O(N)$의 시간이 소요됩니다.
  5. o_quadratic: 이중 루프 순회로 $N imes N$ 번 연산하여 $O(N^2)$ 복잡도를 나타냅니다.

5. 알고리즘 설계 및 최적화 실무 지침 (Best Practices & Complexity Audit)

01. 알고리즘 성능 분석 기초 - 시간 복잡도, 공간 복잡도 및 Big-O 표기법 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

1) 공간/시간 복잡도 한계 및 메모리 사용 제어

2) 예외 케이스(Edge Cases) 및 코딩 테스트 체크리스트

  1. 입력 경계값 검증: $N=1$ 이거나 $N=0$ 인 극단적 최소 입력, 혹은 모든 요소의 값이 동일한 경우(Corner Case)에 대한 예외 처리를 누락하지 않습니다.
  2. 무한 루프 및 사이클 감지: 그래프/트리 탐색 시 방문 처리 배열(visited[])의 업데이트 위치를 정확히 지정하여 중복 큐 삽입으로 인한 메모리 초과를 예방합니다.

6. 핵심 요약 및 실무 FAQ (Summary & Q&A)

Q1. 파이썬 코드 주석에서 강조된 성능 핵심은 무엇인가요?

Q2. 실무 개발에서 본 파이썬 알고리즘 패턴은 어디에 활용되나요?

← 이전 다음 →02. 재귀(Recursion)와 분할 정복(Divide and Conquer) - 콜 스택, 팩토리얼 및 마스터 정리