개발/프로그래머스
동적계획법(Dynamic Programming) > 정수 삼각형 (Level 3)
민돌이2
2024. 11. 24. 04:47
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/43105
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 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;
std::vector< std::vector< int >> dp;
dp.emplace_back( std::vector< int >{ triangle[ 0 ][ 0 ] } );
for( int i = 1; i < triangle.size(); ++i )
{
std::vector< int > vec;
for( int j = 0; j < triangle[ i ].size(); ++j )
{
if( j == 0 )
{
vec.emplace_back( dp[ i - 1 ][ j ] + triangle[ i ][ j ] );
}
else if( j == triangle[ i ].size() - 1 )
{
vec.emplace_back( dp[ i - 1 ][ j - 1 ] + triangle[ i ][ j ] );
}
else
{
int num = std::max( dp[ i - 1 ][ j - 1 ], dp[ i - 1 ][ j ] ) + triangle[ i ][ j ];
vec.emplace_back( num );
}
}
dp.emplace_back( vec );
}
for( int num : dp.back() )
{
if( answer < num )
answer = num;
}
return answer;
}
생각해 볼 것
동적 계획법이란 이미 계산한 모든 값을 가지고 있고 활용해야 한다는 생각에 갇혀있었다.
탐욕법 처럼 위에서 내려갈 때 최대값이 되는 값을 선택해서 저장하는 방식을 떠올리니 쉽게 풀이할 수 있었다.
또한 아래에서 시작해서 위로 올라면서 탐욕법 기반처럼 현재 최대값이 되는 값을 찾아 저장해가며 계산하는 방법도 있다.
728x90