본문 바로가기
알고리즘

프로그래머스_정수 삼각형

by 도승이 2022. 2. 22.

문제 이름 : 정수 삼각형

문제 유형 : 다이나믹 프로그래밍 (DP)

 

  • 정수 삼각형
문제 설명

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

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

제한사항
  • 삼각형의 높이는 1 이상 500 이하입니다.
  • 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
입출력 예triangleresult
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30

 

 

 

 

풀이 : 프로그래머에서 레벨3 난이도지만 쉬운문제다

DP의 원리를안다면 위에서부터 순서대로 구해주면된다.

루트 = DP[0][0] = triangle[0][0] 으로 시작해서

자기자신의 DP값은 이전DP값 + 자기자신이다

예를들어 저기있는 7이 있는곳의 DP값은 (이전 8까지의 DP + 자기자신)또는(이전 1까지의 DP + 자기자신)중 큰값이다

맨 왼쪽 , 오른쪽만 예외를두어서 처리하면 끝

 

 

코드

 

#include <string>
#include <iostream>
#include <vector>

using namespace std;

int dp[501][501];
int max(int a,int b)
{
    if(a>b) return a;
    return b;
}

int solution(vector<vector<int>> triangle) {
    int answer = 0;
    int height = triangle.size();
    dp[0][0]=triangle[0][0];
    for(int i=1;i<height;i++)
    {
        for(int j=0;j<=i;j++)
        {
            if(j==0) dp[i][j] = dp[i-1][j] + triangle[i][j];
            else if(j==i) dp[i][j] = dp[i-1][j-1] + triangle[i][j];
            else dp[i][j] = max(dp[i-1][j-1]+triangle[i][j],dp[i-1][j]+triangle[i][j]);
            
            if(answer<dp[i][j]) answer = dp[i][j];
        }
            
    }
    return answer;
}

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

BOJ_1932_정수 삼각형  (0) 2022.03.06
BOJ_2292_벌집  (0) 2022.03.06
BOJ 2096 내려가기  (0) 2022.02.20
프로그래머스 신규아이디 추천  (0) 2022.02.18
BOJ 2805 나무자르기  (0) 2022.02.14

댓글