[boj] 17404. RGB거리 2 (node.js)
let result = 1000 * N; // 최솟값을 구해야 하므로 최댓값으로 초기화
for (let selected = 0; selected < 3; selected++) {
dp[0] = new Array(3).fill(arr[0][selected]); // 첫 번째 집의 색상 고정
for (let i = 1; i < N; i++) {
dp[i] = []; // 새로운 색상마다 배열 초기화
for (let j = 0; j < 3; j++) {
dp[i][j] = 1000 * (i + 1); // i번째 집 (0부터이므로 + 1) 까지의 최댓값(누적)으로 초기화
for (let prev = 0; prev < 3; prev++) {
if (i == 1) {
// 두 번째 집이라면 첫 번째 집에 고정해둔 색상과 반드시 달라야만 함
if (j == selected) continue;
} else {
// 두 번째 집이 아니라면 이전 집의 색상과 달라야 함
if (j == prev) continue;
}
if (i == N - 1 && selected == j) continue; // 마지막 집이라면 고정 색상과 달라야 함
dp[i][j] = Math.min(dp[i - 1][prev] + arr[i][j], dp[i][j]); // 갱신
}
}
}
result = Math.min(...dp[N - 1], result);
}
dp[i][j] = 1000 * (i + 1);
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const solution = () => {
const N = +input();
const arr = [];
const dp = [];
for (let i = 0; i < N; i++) arr[i] = input().split(" ").map(Number);
let result = 1000 * N;
for (let selected = 0; selected < 3; selected++) {
dp[0] = new Array(3).fill(arr[0][selected]);
for (let i = 1; i < N; i++) {
dp[i] = [];
for (let j = 0; j < 3; j++) {
dp[i][j] = 1000 * (i + 1);
for (let prev = 0; prev < 3; prev++) {
if (i == 1) {
if (j == selected) continue;
} else {
if (j == prev) continue;
}
if (i == N - 1 && selected == j) continue;
dp[i][j] = Math.min(dp[i - 1][prev] + arr[i][j], dp[i][j]);
}
}
}
result = Math.min(...dp[N - 1], result);
}
console.log(result);
};
let line = 0;
const input = () => stdin[line++];
let stdin = [];
rl.on("line", function (line) {
stdin.push(line);
}).on("close", function () {
solution();
process.exit();
});