문제 설명

위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.
삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.
제한사항- 삼각형의 높이는 1 이상 500 이하입니다.
- 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.
입출력 예
triangle | result |
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] | 30 |
방금 푼 백준 문제랑 상당히 비슷한 문제다.
분명히 저번에 레벨3 DP가 너무 어려웠었는데 이건 또 쉽더라.
아까랑 비슷한 점화식으로 풀었다.
아까처럼 메모리 용량을 줄일 수 있을까해서 dp배열은 1차원으로 만들었다.
이번엔 따로 업데이트 해주지 않아도 충분히 가능했다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> triangle) {
int answer = 0;
int dp[500];
for(int i = 0; i < 500; i++)
dp[i] = 0;
dp[0] = triangle[0][0];
for(int i = 1; i < triangle.size(); i++){
dp[i] = dp[i-1] + triangle[i][i];
for(int j = i - 1; j > 0; j--){
dp[j] = std::max(dp[j], dp[j-1]) + triangle[i][j];
}
dp[0] = dp[0] + triangle[i][0];
}
answer = dp[0];
for(int i = 1; i < 500; i++)
answer = std::max(answer, dp[i]);
return answer;
}
후기)
너무 무지성으로 for문 범위를 500으로 설정했다가 세그폴트를 맛봤다.
한 30분동안 원인을 못 찾고 다른데서 삽질했다...ㅋ
정신차리자!! ㅋㅋ;
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 최고의 집합 (0) | 2022.10.01 |
---|---|
[프로그래머스] 섬 연결하기 (2) | 2022.01.06 |
[프로그래머스] 등굣길 (0) | 2022.01.02 |
[프로그래머스] 가장 먼 노드 (1) | 2021.12.30 |
[프로그래머스] 네트워크 (1) | 2021.12.30 |