본문 바로가기
세상의 소리

동적 프로그래밍(Dynamic Programming) 개념

by 강아지톡톡-아지톡 2024. 10. 20.
반응형

동적 프로그래밍(Dynamic Programming) 개념

동적 프로그래밍(DP)은 복잡한 문제를 작은 부분 문제로 나누어 해결하고, 그 해결 결과를 저장해 재사용함으로써 연산을 최적화하는 알고리즘 기법입니다. 이 기법은 주로 중복되는 계산을 피하면서 문제를 효율적으로 해결하는 데 사용됩니다.

일반적으로 두 가지 중요한 특징이 있는 문제에 적용됩니다:

  1. 중복된 부분 문제(Overlapping Subproblems): 동일한 하위 문제를 여러 번 계산해야 할 때.
  2. 최적 부분 구조(Optimal Substructure): 문제의 최적 해결 방법이 하위 문제의 최적 해결 방법으로 구성될 때.

dynamic program 동적프로그램이란?


동적 프로그래밍 방법

동적 프로그래밍의 구현 방법에는 크게 두 가지가 있습니다.

  1. 탑다운 방식 (메모이제이션, Memoization)
    • 재귀적(recursive) 접근법을 사용합니다.
    • 함수가 반복해서 호출될 때, 이전에 계산한 값을 메모리에 저장해 재사용합니다.
    • 불필요한 재계산을 피하므로 시간 복잡도를 줄입니다.
    예시: 피보나치 수열
    python
     
     
    memo = {}
    def fib(n):
        if n in memo:
            return memo[n]
        if n <= 2:
            return 1
        memo[n] = fib(n-1) + fib(n-2)
        return memo[n]
    print(fib(10))  # 결과: 55
  2. 바텀업 방식 (반복적 접근, Iterative Approach)
    • 작은 문제부터 순차적으로 해결해 나갑니다.
    • 배열 등의 자료구조를 사용해 이전 계산 결과를 저장하며, 그 결과를 이용해 더 큰 문제를 해결합니다.
    예시: 피보나치 수열
  3. python
    코드 복사
    def fib(n):
        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]
    print(fib(10))  # 결과: 55


동적 프로그래밍의 활용 사례

  1. 최적화 문제
    • 배낭 문제(Knapsack Problem): 한정된 무게 내에서 가장 큰 가치를 선택하는 문제.
    • 동전 교환 문제(Coin Change Problem): 주어진 동전으로 특정 금액을 만들기 위한 최소 동전 개수를 찾는 문제.
  2. 문자열 관련 문제
    • 최소 편집 거리(Edit Distance): 두 문자열을 같게 만들기 위해 필요한 최소 편집 작업 수.
    • 최장 공통 부분 수열(Longest Common Subsequence, LCS): 두 문자열에서 가장 긴 공통 부분 수열 찾기.
  3. 그래프와 경로 문제
    • 최단 경로 문제(예: Floyd-Warshall 알고리즘): 모든 노드 쌍 간의 최단 경로를 찾는 문제.
    • 벨만-포드(Bellman-Ford) 알고리즘: 음수 가중치를 포함한 그래프의 최단 경로를 계산.
  4. 게임 이론과 확률 문제
    • 게임 전략 최적화: 두 플레이어가 최적의 움직임을 할 때 최대 점수를 얻는 방법 분석.
    • 다항식 계산, 확률 분포 계산 등 다양한 수학적 문제에 응용.

동적 프로그래밍의 장단점

장점

  • 복잡한 문제를 효율적으로 해결할 수 있음.
  • 중복된 계산을 제거하여 시간 복잡도를 줄임.

단점

  • 메모리 사용량이 많아질 수 있음 (특히 바텀업 방식).
  • 이해하고 구현하기 까다로울 수 있음.

활용 방안 정리

동적 프로그래밍은 효율성을 높여야 하는 최적화 문제나 조합 문제에 자주 사용됩니다. 예를 들어, 재귀적으로 풀어야 할 문제를 반복문으로 변환하거나 메모이제이션을 활용해 성능을 개선하는 데 유용합니다. 이를 잘 활용하면 많은 컴퓨터 과학 문제와 알고리즘 문제를 효과적으로 해결할 수 있습니다.

반응형