https://www.acmicpc.net/problem/1932
1932번: 정수 삼각형
첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
www.acmicpc.net
📌 작성한 코드
//1932
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "Beakjoon/Silver/test.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const N = parseInt(input.shift());
const board = input.map((i) => i.split(" ").map(Number));
const dp = Array.from({ length: N }, () => new Array(N).fill(0));
dp[0][0] = board[0][0];
for (let i = 1; i < N; i++) {
for (let j = 0; j < i + 1; j++) {
if (j - 1 < 0) {
dp[i][j] = dp[i - 1][j] + board[i][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j - 1], dp[i - 1][j]) + board[i][j];
}
}
}
console.log(Math.max(...dp[N - 1]));
📌 설명
- 정의 : dp[i][j] = i층에서 j번째 숫자까지 도달하는데 선택된 숫자들의 최댓값
- 점화식 : `dp[i][j] = Math.max(dp[i - 1][j - 1], dp[i - 1][j]) + board[i][j]`
- 왼쪽 대각선 위의 좌표는 [i-1][j-1]이고, 오른쪽 대각선 위의 좌표는 [i-1][j]이다.
for (let i = 1; i < N; i++) {
for (let j = 0; j < i + 1; j++) {
if (j - 1 < 0) { // 왼쪽 대각선이 존재하지 않으면 무조건 오른쪽 대각선에서 내려와야 함
dp[i][j] = dp[i - 1][j] + board[i][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j - 1], dp[i - 1][j]) + board[i][j];
}
}
}
✅ 성공

'알고리즘 > 백준' 카테고리의 다른 글
| [JavaScript/DP] 백준 실버 3 : 11727 - 2xn 타일링 2 (0) | 2024.02.17 |
|---|---|
| [JavaScript/DP] 백준 실버 2 : 1912 - 연속합 (0) | 2024.02.17 |
| [JavaScript/DP] 백준 실버 3 : 1003 - 피보나치 함수 (0) | 2024.02.16 |
| [JavaScript/DP] 백준 실버 1 : 12852 - 1로 만들기 2 (1) | 2024.02.16 |
| [JavaScript/DP] 백준 실버 3 : 11726 - 2xn 타일링 (0) | 2024.02.16 |