programmers.co.kr/learn/courses/30/lessons/43105
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 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 |
#include <string>
#include <vector>
#include <stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int Size;
vector<vector<int>> cache;
int triangleSum(int height,int Rowindex,vector<vector<int>>& triangle)
{
if(height == Size - 1)
{
return triangle[height][Rowindex];
}
int& ret = cache[height][Rowindex];
if(ret == -1)
{
ret = max(triangleSum(height+1,Rowindex, triangle),triangleSum(height+1,Rowindex + 1, triangle));
ret += triangle[height][Rowindex];
}else{
return ret;
}
return ret;
}
int solution(vector<vector<int>> triangle) {
int answer = 0;
Size = triangle.size();
cache.assign(triangle.size(),vector<int>(triangle.size(),-1));
answer = triangleSum(0, 0, triangle);
return answer;
}
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> triangle) {
int answer = 0;
vector<vector<int>> triangleSum;
for (int i = 0; i < triangle.size(); i++)
{
vector<int> temp;
for (int j = 0; j < triangle[i].size(); j++)
{
temp.push_back(0);
}
triangleSum.push_back(temp);
}
for (int i = triangle.size() - 1; i >= 0; i--)
{
for (int j = 0; j < triangle[i].size(); j++)
{
if (i == triangle.size() - 1)
{
triangleSum[i][j] = triangle[i][j];
}
else
{
triangleSum[i][j] = max(triangle[i][j] + triangleSum[i + 1][j], triangle[i][j] + triangleSum[i + 1][j + 1]);
}
}
}
answer = triangleSum[0][0];
return answer;
}
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(vector<vector<int>> triangle)
{
int ans = 0;
int dp[501][501] = {
triangle[0][0],
};
for (int i = 1; i < triangle.size(); i++)
{
dp[i][0] = dp[i - 1][0] + triangle[i][0];
dp[i][i] = dp[i - 1][i - 1] + triangle[i][i];
ans = max( dp[i][0], max( dp[i][i], ans) );
}
for (int i = 2; i < triangle.size(); i++)
{
for (int j = 1; j < triangle[i].size() - 1; j++)
{
dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j];
ans = max(ans, dp[i][j]);
}
}
return ans;
}
'프로그래머스 > 3 단계' 카테고리의 다른 글
[ 프로그래머스 3 단계 ] 입국심사 (0) | 2021.05.13 |
---|---|
[ 프로그래머스 3 단계 ] 단속카메라 (0) | 2021.05.12 |
[ 프로그래머스 3 단계 ] 디스크 컨트롤러 (0) | 2021.04.26 |
[ 프로그래머스 3 단계 ] 네트워크 (0) | 2021.04.06 |