LeetCode Triangle (JavaScript)

2025. 12. 19. 17:14·코딩테스트/LeetCode

링크 : https://leetcode.com/problems/triangle/description/

문제 설명

더보기

Given a triangle array, return the minimum path sum from top to bottom.

For each step, you may move to an adjacent number of the row below. More formally, if you are on index i on the current row, you may move to either index i or index i + 1 on the next row.

Example 1:

Input: triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
Output: 11
Explanation: The triangle looks like:
23 4
 65 7
41 8 3
The minimum path sum from top to bottom is 2 + 3 + 5 + 1 = 11 (underlined above).

Example 2:

Input: triangle = [[-10]]
Output: -10

Constraints:

  • 1 <= triangle.length <= 200
  • triangle[0].length == 1
  • triangle[i].length == triangle[i - 1].length + 1
  • 104 <= triangle[i][j] <= 104

문제 풀이

1. dfs로 풀이 (시간 초과)

/**
 * @param {number[][]} triangle
 * @return {number}
 */
var minimumTotal = function(triangle) {
  const dfs = (depth, index, sum, minimum) => {
    if (minimum < sum) return;
    if (depth === triangle.length - 1) {
      return Math.min(minimum, sum);
    }

    return Math.min(
      dfs(depth + 1, index, sum + triangle[depth + 1][index], minimum), 
      dfs(depth + 1, index + 1, sum + triangle[depth + 1][index + 1], minimum)
    );
  }
    
  return dfs(0, 0, triangle[0][0], Infinity);
};

 

2. dp (top-down) - 성공

최상단에서 다음 row에 대해 각 요소에서 가장 작은 값을 계산하며 마지막 row까지 계산하고, 최종적으로 마지막 row에 가장 작은 값을 리턴하면 됨

/**
 * @param {number[][]} triangle
 * @return {number}
 */
var minimumTotal = function(triangle) {
  for (let i = 1; i < triangle.length; i++) {
    for (let j = 0; j < triangle[i].length; j++) {
      if (j === 0) {
        triangle[i][j] += triangle[i - 1][j];
      } else if (j === triangle[i].length - 1) {
        triangle[i][j] += triangle[i - 1][j - 1];
      } else {
        triangle[i][j] += Math.min(triangle[i - 1][j - 1], triangle[i - 1][j]);
      }
    }
  }

  return Math.min(...triangle[triangle.length - 1]);
};

 

3. dp (bottom-up) - 성공

top-down 방식에서 불필요한 if-else 문을 지우고 더 최적화하여 bottom-up형태로 수정

/**
 * @param {number[][]} triangle
 * @return {number}
 */
var minimumTotal = function(triangle) {
    for (let i = triangle.length - 2; i >=0; i--) {
        for (let j = 0; j < triangle[i].length; j++) {
            triangle[i][j] += Math.min(
                triangle[i + 1][j],
                triangle[i + 1][j + 1]
            )
        }
    }

    return triangle[0][0];
};

결론

dfs로는 depth가 깊어지면 시간 초과 오류가 발생.

dp를 이용해 top-down, bottom-up 형태로 문제를 해결할 수 있고 bottom-up 형태가 불필요한 if-else 문이 없어 더 빠른 시간안에 해결이 가능하다.

'코딩테스트 > LeetCode' 카테고리의 다른 글

LeetCode Decode Ways (JavaScript), (DFS, Memoization)  (0) 2025.12.22
LeetCode Subsets ll (JavaScript), backtracking  (0) 2025.12.18
LeetCode Search in Rotated Sorted Array (JavaScript)  (0) 2025.12.17
LeetCode Remove Duplicates from Sorted Array ll (JavaScript)  (0) 2025.12.17
LeetCode Set Matrix Zeroes (JavaScript)  (0) 2025.12.16
'코딩테스트/LeetCode' 카테고리의 다른 글
  • LeetCode Decode Ways (JavaScript), (DFS, Memoization)
  • LeetCode Subsets ll (JavaScript), backtracking
  • LeetCode Search in Rotated Sorted Array (JavaScript)
  • LeetCode Remove Duplicates from Sorted Array ll (JavaScript)
의현
의현
개발하는 하루
  • 의현
    UIHYEON
    의현
  • 링크

    • 김의현 포트폴리오
    • GitHub
    • LinkedIn
  • 전체
    오늘
    어제
    • 분류 전체보기 (215) N
      • 프론트엔드 (65) N
        • JavaScript (52) N
        • HTML (3)
        • React (7)
        • CSS (2)
        • CS (1)
      • 프로젝트 (19)
        • Portfolio 사이트 개발 (19)
      • 코딩테스트 (128) N
        • Binary Search (2)
        • bfs (Breadth-first s.. (4)
        • dfs (Deapth-first se.. (1)
        • Greedy (1)
        • Dynamic Programming (1)
        • two pointer (4)
        • 구현 (2)
        • LIS(Longest Increasi.. (0)
        • 문자열 (3)
        • 자료구조 (6)
        • 비트마스크 (2)
        • 수학 (2)
        • 프로그래머스 (61)
        • LeetCode (39) N
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
의현
LeetCode Triangle (JavaScript)
상단으로

티스토리툴바