본문 바로가기

백준/C++

[Baekjoon/C++] 정수 삼각형 1932번

Baekjoon Online Judge

문제로 이동

 

문제

        7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5

위 그림은 크기가 5인 정수 삼각형의 한 모습이다.

맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.

삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.

 

입력

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

 

출력

첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.

 


예제 입력 예제 출력
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
30

풀이

#include <iostream>
#include <algorithm>
using namespace std;

int semo[501][501] = {};

int main() {
    // 삼각형의 크기
    int n; 
    cin >> n;

    // 합이 최대가 되는 경로에 있는 수의 합
    int big = -1;

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            // 삼각형을 이루는 수 입력
            scanf("%d", &semo[i][j]);

            // 삼각형의 왼쪽 변
            if (j == 1)
                semo[i][j] += semo[i - 1][j];
            // 삼각형의 오른쪽 변
            else if (j == i)
                semo[i][j] += semo[i - 1][j - 1];
            // 삼각형 중간의 숫자
            else 
                semo[i][j] += max(semo[i - 1][j - 1], semo[i - 1][j]);

            // 최대합 찾기
            if (semo[i][j] > big && i == n)
                big = semo[i][j];
        }
    }

    // 출력
    cout << big << "\n";
        
    return 0;
}

삼각형을 구성하는 새로운 숫자가 새로 입력될 때마다 아래처럼 코드가 동작하게 하였다.

7

7
10 
7
10 15
7
10 15
18 
7
10 15
18 16
7
10 15
18 16 15
7
10 15
18 16 15
20 
7
10 15
18 16 15
20 25
7
10 15
18 16 15
20 25 20
7
10 15
18 16 15
20 25 20 19
7
10 15
18 16 15
20 25 20 19
24
7
10 15
18 16 15
20 25 20 19
24 30
7
10 15
18 16 15
20 25 20 19
24 30 2 6 5
7
10 15
18 16 15
20 25 20 19
24 30 27
7
10 15
18 16 15
20 25 20 19
24 30 27 26
7
10 15
18 16 15
20 25 20 19
24 30 27 26 24

새로운 숫자가 입력되면 대각선 왼쪽 또는 대각선 오른쪽에 있는 전에 입력된 숫자 중에서 큰 숫자와 +연산을 수행하게 된다. 이를 반복하다 i가 n인 배열에서 가장 큰 수를 찾아서 출력한다.

'백준 > C++' 카테고리의 다른 글

[Baekjoon/C++] 음계 2920번  (0) 2022.04.13
[Baekjoon/C++] 검증수 2475번  (0) 2022.04.13
[Baekjoon/C++] 파도반 수열 9461번  (0) 2022.04.13
[Baekjoon/C++] 01타일 1904번  (0) 2022.04.13
[Baekjoon/C++] 신나는 함수 실행 9184번  (0) 2022.04.13