개발/프로그래머스

동적계획법(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