위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.
삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.
언어 : Java
접근 : 이 문제에서는 대각선 방향으로 내려오며 숫자를 더하여 큰 값을 찾는 것이다.
전체가 아니라 작은 삼각형으로 쪼개어 위의 값들을 더해서 내려오면서 계산하여 큰 값을 찾는다. 따라서 dpT라는 dp를 이용할 정삼각형 배열을 만들어 가장 왼쪽 원소는 윗줄의 가장 왼쪽 값만을 더하고, 가장 오른쪽 원소는 윗줄의 가장 오른쪽 값만을 더하고, 중간의 원소들은 대각선 왼쪽 dpT[i-1][j-1]과 오른쪽 dpT[i-1][j] 중 큰 값을 더해서 저장해주고, 마지막 줄의 값 중 가장 큰 값을 결과값으로 도출한다.
class Solution {
public int solution(int[][] triangle) {
int answer = 0;
int[][] dpT = new int [triangle.length][triangle.length];
dpT[0][0] = triangle[0][0];
for(int i = 1; i < triangle.length; i++){
//왼쪽 끝 원소의 경우 : 윗 줄의 왼쪽 끝 원소만 더해준다.
dpT[i][0] = dpT[i-1][0] + triangle[i][0];
for(int j = 1; j < i; j++){
//가운데 원소의 경우 : 윗줄의 대각선 왼쪽과 오른쪽 값 중 큰 값을 더해준다.
dpT[i][j] = Math.max(dpT[i-1][j-1], dpT[i-1][j]) + triangle[i][j];
}
//오른쪽 끝 원소의 경우 : 윗줄의 오른쪽 끝 원소만 더해준다.
dpT[i][i] = dpT[i-1][i-1] + triangle[i][i];
}
for(int i = 0; i< dpT.length; i++){
answer = Math.max(answer, dpT[triangle.length - 1][i]);
}
return answer;
}
}
DP (다이내믹 프로그래밍)은 다음과 같은 경우에 사용한다.
이 문제에서는 대각선 방향으로 내려오며 숫자를 더하여 큰 값을 찾는 것이다.
전체가 아니라 작은 삼각형으로 쪼개어 위의 값들을 더해서 내려오면서 계산하여 큰 값을 찾는다.
정삼각형이라는 조건이 있었기 때문에 코드를 작성했을 때 trinagle[i].length 가 결국 i+1 이 된다는 사실을 인지하고 작성한다. 예를 들면, triangle[1].length 는 두번째 줄로 2이다.