// education

09. 동적 계획법(Dynamic Programming) 1: 기초 - Top-down(메모이제이션) vs Bottom-up(타뷸레이션)

소규모 하위 문제들의 해를 저장해 두었다가 재활용하는 **동적 계획법(Dynamic Programming: DP)**의 기본 개념과 Top-down vs Bottom-up 방식을 학습합니다.


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

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

from functools import lru_cache

# 1. Top-down DP (@functools.lru_cache 파이썬 자동 메모이제이션)
@lru_cache(maxsize=None)  # 함수의 리턴값을 자동으로 메적하여 중복 연산 방지
def fib_top_down(n: int) -> int:
    """Top-down 재귀 + 메모이제이션 피보나치"""
    if n <= 2:  # Base Case
        return 1
    # 하위 문제로 재귀 호출 후 캐시된 결과 반환
    return fib_top_down(n - 1) + fib_top_down(n - 2)

# 2. Bottom-up DP (Tabulation 반복문 기반 테이블 구축)
def fib_bottom_up(n: int) -> int:
    """Bottom-up 반복문 타뷸레이션 피보나치"""
    if n <= 2:
        return 1
    # DP 테이블 할당 및 초기 상태 설정
    dp = [0] * (n + 1)
    dp[1] = dp[2] = 1
    
    # 소규모 문제부터 순차적으로 점화식 채워 나가기
    for i in range(3, n + 1):
        dp[i] = dp[i - 1] + dp[i - 2]
    return dp[n]

if __name__ == "__main__":
    print("피보나치 50항 (Top-down DP):", fib_top_down(50))
    print("피보나치 50항 (Bottom-up DP):", fib_bottom_up(50))

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

  1. @lru_cache: 파이썬 표준 라이브러리로, 함수의 리턴값을 자동으로 캐싱하는 강력한 메모이제이션 데코레이터 주석 해설입니다.
  2. dp[i] = dp[i-1] + dp[i-2]: 점화식을 바탕으로 배열을 채워 올라가는 전통적 Bottom-up 타뷸레이션 방식입니다.

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

09. 동적 계획법(Dynamic Programming) 1: 기초 - Top-down(메모이제이션) vs Bottom-up(타뷸레이션) 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

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

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

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

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

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

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

← 이전08. 탐욕법(Greedy Algorithm) - 그리디 선택 속성, 회의실 배정 및 분할 배낭 문제 다음 →10. 동적 계획법(DP) 2: 실전 대표 문제 - LIS($O(N \log N)$), 0-1 배낭 문제 및 편집 거리