Krafton Jungle/1. 정글 개발일지

알고리즘 설계 기법 ①

munsik22 2025. 3. 21. 16:40

알고리즘이란?

알고리즘은 한 마디로 말해 결과물을 위한 레시피이다.

문제와 알고리즘 (Problems and Algorithms)

  • 알고리즘을 설계하기 전에 문제를 명확히 정의해야 한다.
    • "풀어야 하는 문제는 무엇인가?"
    • "무엇을 해야 하는가?"
    • "이 코드는 무엇을 하는 코드인가?"
  • 문제 (Problem): 가능한 입력들의 집합과 각 입력에 대한 출력의 쌍
  • 알고리즘 (Algorithm): 주어진 문제를 해결하기 위한 기본 연산들의 시퀀스 (How?)

알고리즘 기술 방법

  • 자연어 (이해 쉬움, 코딩 어려움)
  • 슈도 코드 (알고리즘의 핵심을 표현)
  • 프로그램 코드 (코딩 쉬움, 이해 어려움)

알고리즘 분석

  • Correctness Proof (정확성 증명)
  • Running Time Analysis (시간 복잡도 분석)

재귀 (Recursion)

모든 것은 재귀로 해결될 수 있다!

재귀와 알고리즘 설계 기법

  • 분할 정복 (Divide & Conquer)
  • 백트래킹 (Backtracking)
  • 동적 계획법 (Dynamic Programming, DP)
  • 탐욕법 (Greedy Algorithm)
  • 트리 및 그래프 탐색 (Tree & Graph Traversal)

재귀의 예

  • 팩토리얼 계산
  • 자연수의 정의
  • 점화식 및 수열
  • 자료구조 (연결 리스트, 이진 트리)
  • 재귀적 알고리즘 & 재귀 함수
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n-1)

문제 축소 (Reduction)

알고리즘 설계에서 가장 중요한 기법 중 하나는 문제를 더 작은 문제로 축소하는 것이다.

  • 문제 X를 문제 Y로 변환 (Reduction)
  • Y의 알고리즘을 호출하여 X를 해결
  • 예시:
    • 최소값 찾기: sorted(A)[0]
    • k번째 최소값 찾기: sorted(A)[k-1]

재귀와 Reduction

  • 재귀는 특별한 종류의 Reduction
  • 문제의 크기를 점점 줄여서 해결
  • Recursion = Subproblem으로 Reduction
  • 내부 동작을 신경 쓰지 말 것!

하노이의 탑 (Hanoi Tower)

문제 정의

n개의 디스크를 기둥1에서 기둥3으로 옮기는 방법은?

해결 방법 (재귀)

  1. n-1개의 디스크를 기둥1 → 기둥2로 이동
  2. n번째 디스크를 기둥1 → 기둥3으로 이동
  3. n-1개의 디스크를 기둥2 → 기둥3으로 이동

하노이의 탑 알고리즘

HANOI(n, src, dst, tmp):
    if n > 0:
        HANOI(n-1, src, tmp, dst)
        move disc n from src to dst
        HANOI(n-1, tmp, dst, src)

시간 복잡도 분석

  • T(n) = 2T(n-1) + 1
  • T(n) = O(2^n)

정렬 알고리즘 (Sorting Algorithms)

병합 정렬 (Merge Sort)

과정

  1. 배열을 절반으로 나눔
  2. 두 개의 부분 배열을 각각 정렬 (재귀)
  3. 두 부분 배열을 합쳐 정렬된 배열 생성
MERGE(A[1..n], m):
    i ← 1; j ← m+1
    for k ← 1 to n
        if j > n:
            B[k] ← A[i]; i ← i+1
        else if i > m:
            B[k] ← A[j]; j ← j+1

시간 복잡도

  • O(n log n)
  • 점화식: T(n) = 2T(n/2) + O(n)

퀵 정렬 (Quick Sort)

과정

  1. Pivot 선택
  2. Partition: pivot을 기준으로 작은 값은 앞으로, 큰 값은 뒤로 정렬
  3. 두 개의 부분 배열을 재귀적으로 정렬

시간 복잡도

  • 최악: O(n²) (pivot이 한쪽 끝에 치우친 경우)
  • 최선: O(n log n)
  • 점화식: T(n) = T(r-1) + T(n-r) + O(n)

Recursion 정리

  • Simplify and delegate!
    • Simplify : 더 작은 instance(subproblem)를 만들고
    • Delegate : 던져버리고 잊어버려라. Recursion의 요정이 다 해준다(?)
  • 자신으로 문제를 줄여나가는 전략
  • 정확성 증명은 수학적 귀납법 (Induction)으로 가능
  • 시간 복잡도 분석: 점화식을 통해 분석