ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] BOJ 1932번: 정수 삼각형
    프로그래밍/알고리즘 PS 2024. 4. 18. 16:48

    학교에서 진행하는 수업에서 공유받은 알고리즘 문제를 풀어보았다.

     

    문제의 난이도는 실버 1로, dp 방식을 활용해 푸는 것을 권장받은 문제이다.

    문제 링크

    https://www.acmicpc.net/problem/1932

    문제 분석

     이번 문제는 주어진 삼각형에 대하여, 모든 숫자의 합이 최대가 되는 경로에 있는 숫자의 합을 출력하는 문제이다.

    자료 구조 및 알고리즘

    DP (Dynamic Programming)

    dp는 큰 문제를 작은 문제로 쪼개고 합쳐 문제를 해결하는 방식 중 하나이다. 중복되는 연산을 방지할 때 주로 사용되며, 이는 메모이제이션이라고도 한다. 예를 들어 피보나치 수열을 계산할 때에 DP를 사용할 수 있다.

    문제 풀이

     이번 문제를 풀 때에 유심히 봐야할 것은 경로를 선택할 때에 현재 층에서 아래층에 있는 수를 고를 때, 대각선 왼쪽이나 대각선 오른쪽에 있는 것만을 선택할 수 있다는 점이다.

     

     경로에 대한 최댓값 식은 다음 식으로 작성할 수 있다. 아래층 c까지의 경로의 최댓값 = max(오른쪽 경로 a까지의 최댓값, 왼쪽 경로 b까지의 최댓값) + 현재 층의 값

     

     위의 식을 활용하면서 문제를 해결하도록 코드로 옮기면 아래와 같다.

    전체 코드

    #include <iostream>
    
    using namespace std;
    
    int triangle[501][501];
    int dp[501][501];
    int n;
    
    int main(void)
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        cin >> n;
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < i + 1; j++)
            {
                cin >> triangle[j][i];
            }
        }
    
        dp[0][0] = triangle[0][0];
    
        int maxValue = dp[0][0];
    
        for (int i = 1; i < n; i++)
        {
            for (int j = 0; j < i + 1; j++)
            {
                if (j - 1 >= 0)
                    dp[j][i] = max(dp[j - 1][i - 1], dp[j][i - 1]) + triangle[j][i];
                else
                    dp[j][i] = dp[j][i - 1] + triangle[j][i];
                maxValue = max(maxValue, dp[j][i]);
            }
        }
    
        cout << maxValue << '\n';
    
        return 0;
    }

    '프로그래밍 > 알고리즘 PS' 카테고리의 다른 글

    [C++] BOJ 5430번: AC  (1) 2024.04.19
    [C++] Programmers: 의상  (0) 2024.04.18
    [C++] BOJ 1717번: 집합의 표현  (0) 2024.04.18
    [C++] BOJ 1806번: 부분 합  (0) 2024.04.12
    [C++] BOJ 2178번: 미로 탐색  (0) 2024.04.12
Designed by Tistory.