거북목 아니라구요
  • 다이나믹 프로그래밍
    2024년 08월 20일 11시 10분 22초에 업로드 된 글입니다.
    작성자: hwangmono__o

    다이나믹 프로그래밍이란?

    다이나믹 프로그래밍은 복잡한 문제를 여러 하위 문제로 나누어 해결한 뒤, 그 결과를 결합하여 전체 문제를 해결하는 방법입니다. DP는 주로 중복된 하위 문제가 존재하는 경우에 사용됩니다. 같은 하위 문제를 여러 번 계산하지 않고, 이미 계산된 결과를 저장해두고 필요할 때 재사용하는 것이 핵심입니다.

    다이나믹 프로그래밍의 특징

    • 최적 부분 구조: 문제의 최적 해가 그 하위 문제들의 최적 해로 구성됩니다.
    • 중복된 하위 문제: 동일한 하위 문제를 반복해서 계산하지 않고, 한 번 계산한 값을 저장해서 재사용합니다.

    다이나믹 프로그래밍의 접근 방식 - Java 구현

    상향식 접근 (Bottom-Up)

    public class FibonacciDP {
    public static int fibonacci(int n) {
    if (n <= 1) return n;
    int[] dp = new int[n + 1];
    dp[0] = 0;
    dp[1] = 1;
    for (int i = 2; i <= n; i++) {
    dp[i] = dp[i - 1] + dp[i - 2];
    }
    return dp[n];
    }
    public static void main(String[] args) {
    int n = 10;
    System.out.println("Fibonacci " + n + "th number: " + fibonacci(n));
    }
    }

    이 코드에서는 피보나치 수열을 계산하기 위해 상향식 접근 방식을 사용했습니다. dp 배열에 작은 문제들의 결과를 저장하고, 이를 사용해 큰 문제를 해결합니다.

     

    하향식 접근 (Top-Down)

    public class FibonacciMemoization {
    private static int[] memo;
    public static int fibonacci(int n) {
    if (n <= 1) return n;
    if (memo[n] != -1) return memo[n];
    memo[n] = fibonacci(n - 1) + fibonacci(n - 2);
    return memo[n];
    }
    public static void main(String[] args) {
    int n = 10;
    memo = new int[n + 1];
    for (int i = 0; i <= n; i++) {
    memo[i] = -1;
    }
    System.out.println("Fibonacci " + n + "th number: " + fibonacci(n));
    }
    }

    이 코드에서는 재귀와 메모이제이션을 사용해 피보나치 수열을 계산했습니다. 처음 호출 시 memo 배열이 -1로 초기화되며, 이미 계산된 결과는 메모이제이션 배열에 저장됩니다. 이를 통해 중복 계산을 방지할 수 있습니다.


    다이나믹 프로그래밍의 활용 사례

    피보나치 수열: 앞서 설명한 대로, DP로 쉽게 해결할 수 있는 문제
    최대 부분 배열 문제(Kadane's Algorithm): 주어진 배열에서 연속된 부분 배열 중 가장 큰 합을 찾는 문제
    0/1 배낭 문제(Knapsack Problem): 제한된 무게를 초과하지 않으면서 최대 가치를 가지는 물건 조합을 찾는 문제
    최단 경로 문제: 그래프에서 두 정점 사이의 최단 경로를 찾는 문제(Dijkstra, Floyd-Warshall 알고리즘)

    'Algorithm > 알고리즘' 카테고리의 다른 글

    카데인 알고리즘  (0) 2024.07.16
    브루트포스 탐색 알고리즘  (0) 2024.06.04
    Z-order 탐색 알고리즘  (0) 2024.05.21
    유클리드 호제법(Euclidean Algorithm)  (2) 2024.05.16
    댓글