PS/Programmers

Programmers / Level 3 / 정수 삼각형 / JS

KimMinJun 2025. 9. 10. 23:32

https://school.programmers.co.kr/learn/courses/30/lessons/43105

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풀이

function solution(triangle) {
  const height = triangle.length;
  const dp = Array.from({ length: height }, (_, i) => Array(i + 1));
  dp[0][0] = triangle[0][0];

  for (let i = 1; i < height; i++) {
    for (let j = 0; j < triangle[i].length; j++) {
      dp[i][j] =
        Math.max(dp[i - 1][j - 1] ?? 0, dp[i - 1][j] ?? 0) + triangle[i][j];
    }
  }

  return Math.max(...dp[height - 1]);
}

문제 자체는 간단하다.

주어진 triangle 배열과 똑같은 형태의 배열을 선언해주고 dp로 풀었다.

dp로 이전 행의 좌, 우를 비교해서 더 큰 값에 현재 위치의 값을 더해주면 된다.

 

여기서, 각 행의 가장 왼쪽과 오른쪽에 있는 값들은 각각 이전 행의 왼쪽과 오른쪽은 범위를 벗어나게 된다.

따라서 범위를 벗어나게 될 경우의 처리가 중요하다.

 

여기서 '널 병합 연산자(??)'를 사용하였다.

'널 병합 연산자'는 왼쪽 피연산자가 `null`또는 `undefined`일 때 오른쪽 피연산자를 반환하고,

그렇지 않으면 왼쪽 피연산자를 반환하는 논리 연산자이다.

 

배열의 범위를 벗어난 인덱스를 참조할 경우, `undefined`가 나온다.

따라서 널 병합 연산자를 통해서 그럴 경우엔 0으로 임시 값을 주는 것이다.

(삼각형 주변에 0 padding을 둘러싼 효과라고 생각하면 편할 것 같다.)

 

물론 falsy 값을 잡아내는 그냥 `or(||)`연산자를 사용해도 되지만,

이 문제에서는 정확히 `undefined`의 값만 판별하면 되므로 '??'를 사용하였다.