프로그래머스 풀이

[c++]정수 삼각형

Iam_noob 2024. 10. 28. 21:02
728x90
반응형

출처:프로그래머스

문제 설명

위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.

삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.

제한사항

  • 삼각형의 높이는 1 이상 500 이하입니다.
  • 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.

문제풀이

#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> triangle) {
    int answer = 0;
    int n = triangle.size();
    
    for(int i = n-2; i >= 0; i--){ //끝에서 두번째 줄부터 더하기 시작
        for(int j = 0; j < triangle[i].size(); j++){
        	//현재 층 값을 아래층 두값 중 큰 값과 합을 구하기
            triangle[i][j] += max(triangle[i+1][j], triangle[i+1][j+1]); 
        }
    }
    //결국 마지막에 꼭대기값이 최대 합
    answer = triangle[0][0];
    return answer;
}

하단에서 최댓값을 계산하여 누적해 올라가는 방식으로 DP를 이용하였다. DP에서는 이미 계산한 값을 재사용할 수있어서, 같은 경로를 여러번 계산하지 않고도 결과를 구해낼 수 있다. 

728x90
반응형

'프로그래머스 풀이' 카테고리의 다른 글

[c++]N개의 최소공배수  (0) 2024.11.12
[c++]의상  (0) 2024.10.31
[c++] 이중우선순위큐  (2) 2024.10.28
[c++][javascript] 옹알이(1)  (0) 2024.10.24
[c++]같은 숫자는 싫어  (3) 2024.10.24