190119 DP (3) 정수 삼각형
DP (3) 정수 삼각형
문제 설명
위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 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 |
풀이 과정
- 각 노드에 올 때까지 거쳐간 숫자의 최대값을 배열에 저장해서
- 맨 아랫줄에서 가장 큰 값을 선택하면 된다.
- 맨 왼쪽으로 내려오는 경우/ 맨 오른쪽으로 내려오는 경우/ 그 가운데의 경우 이렇게 나눠서 생각
class Solution {
public int solution(int[][] triangle) {
int answer = 0;
int[][] dp=new int[501][501];
// dp배열: 그 노드에 올때까지 거쳐간 숫자의 최대값
for(int i=1;i<=triangle.length;i++){
for(int j=1;j<=i;j++){
dp[i][j]=triangle[i-1][j-1];
}
}
for(int i=2;i<=triangle.length;i++){
for(int j=1;j<=i;j++){
// 왼쪽 끝 정수
if(j==1)
dp[i][j]+=dp[i-1][j];
// 오른쪽 끝 정수
else if(j==triangle.length)
dp[i][j]+=dp[i-1][j-1];
// 중간에 있는 정수-> 양쪽으로 내려가는 방법이 있으므로 둘중 큰 경로를 선택해서 내려와야 한다.
else
dp[i][j]+=Math.max(dp[i-1][j],dp[i-1][j-1]);
}
}
for(int i=1;i<=triangle.length;i++){
// 맨 아래에 저장된 거쳐간 숫자들 중 가장 큰 값을 선택
answer=Math.max(answer,dp[triangle.length][i]);
}
return answer;
}
}
- 출처 를 참조해서 풀었다!
- 고민해도 안 풀릴땐 남의 코드를 보는것도 좋은 방법인것 같다…
- 물론 유사한 유형의 문제를 한번 더 풀어봐야겠지..!