삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능할 때 거쳐간 숫자의 최댓값
문제만 봤을 땐, DFS로 전부 다 탐색할 수 있겠다라는 생각을 했다.
제약 조건을 보니 N이 1~500까지였다. 이를 최악의 경우를 계산해보니 총 노드이 개수는 약 125,000개가 된다. 이를 DFS로 돌리기란 시간복잡도에서 무조건 문제가 생긴다.
문제를 다시 보니 DP 중 메모이제이션을 활용해 풀면 해결될 것 같다는 생각을 했고, 내가 생각한 알고리즘대로 풀어보니 답이 나왔다.

알고리즘 : DP (메모이제이션)
class Solution {
int[][] triangle;
public int solution(int[][] triangle) {
int answer = 0;
this.triangle = triangle;
// 1. 위에서 아래로 내려간다 1번 인덱스부터 n번 인덱스까지
int start = triangle[0][0];
int len = triangle.length;
for (int i = 1; i < len; i++) {
// 2. 0번 인덱스부터 i 인덱스까지 돌면서 값 업데이트
for (int j = 0; j <= i; j++) {
// 3. 누적합 계산
triangle[i][j] = memoization(i, j);
}
}
// 4. 모든 값을 업데이트한 뒤, 제일 바닥에서 값이 제일 큰걸 answer에 둔다
for (int i = 0; i < len; i++) {
answer = Math.max(answer, triangle[len-1][i]);
}
return answer;
}
// h : 높이, w : 너비
public int memoization(int h, int w) {
int res = triangle[h][w];
// 3-1. 가장 좌측 한번의 연산만 함
if (w == 0) {
res += triangle[h-1][0];
}
// 3-2. 우측이라면 한번의 연산만 함
else if (h == w) {
res += triangle[h-1][w-1];
}
// 3-3. 위의 두 경우가 아니라면 두 부모의 값 중 큰 것과 합한다.
else {
int num = Math.max(triangle[h-1][w-1], triangle[h-1][w]);
res += num;
}
return res;
}
}