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`의 값만 판별하면 되므로 '??'를 사용하였다.
'PS > Programmers' 카테고리의 다른 글
Programmers / Level 3 / 단속카메라 / JS (0) | 2025.09.12 |
---|---|
Programmers / Level 2 / 가장 큰 수 / JS (0) | 2025.09.09 |
Programmers / Level 2 / 양궁대회 / JS (0) | 2025.09.08 |
Programmers / Level 2 / 전력망을 둘로 나누기 / JS (0) | 2025.09.05 |