

const { count } = require("console");
const fs = require("fs");
const { nextTick } = require("process");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./예제.txt";
let input = fs.readFileSync(filePath).toString().trim();
// const fs = require('fs');
// let input = fs.readFileSync('/dev/stdin').toString().trim();
input=input.split('\n')
// console.log(input)
let realInput=new Array();
// console.log('realInput', realInput)
for (let i=0;i<input.length;i++){
// console.log('realInput', realInput)
let [a,b,c]=input[i].split(' ').map((el)=>+el)
if (a===-1&&b===-1&&c===-1){
0
}else{
realInput.push(input[i])
}
}
input=realInput
// console.log('realInput', input)
const dp = {};
const recursive=(a,b,c)=>{
if (a <= 0 || b <= 0 || c <= 0) {
return 1;
}
if (a > 20 || b > 20 || c > 20) {
return recursive(20, 20, 20);
}
if (dp[a][b][c]) {
return dp[a][b][c];
}
if (a < b && b < c) {
dp[a][b][c] =
recursive(a, b, c - 1) +
recursive(a, b - 1, c - 1) -
recursive(a, b - 1, c);
} else {
dp[a][b][c] =
recursive(a - 1, b, c) +
recursive(a - 1, b - 1, c) +
recursive(a - 1, b, c - 1) -
recursive(a - 1, b - 1, c - 1);
}
return dp[a][b][c];
}
for (let j=0;j<input.length;j++){
for (let i = 0; i <= 20; i++) {
dp[i] = [];
for (let j = 0; j <= 20; j++) {
dp[i][j] = [];
for (let k = 0; k <= 20; k++) {
dp[i][j][k] = null;
}
}
}
let [a, b, c]=input[j].split(' ').map(Number)
console.log(`w(${a}, ${b}, ${c}) = ${recursive(a, b, c)}`);
}
다이나믹 프로그래밍 문제를 풀 때 생각해야 하는 것들
1. 무엇을 dp로 잡을 것인가
2. dp를 몇 차원 배열로 잡을 것인가.
++기억해야 할 점은 아니고 의문점이다. 문제에서 마지막 입력값은 -1 -1 -1이라며 이 행이 나오기 전까지만 계산하면 된다고 해서 for문을 돌릴 때 input.length-1까지만 돌려줬는데 백준이 틀렸다고 했다. 왜지?