kakasoo

[node.js] 신나는 함수 실행 ( 백준 9184번 ) 본문

프로그래밍/알고리즘 풀이

[node.js] 신나는 함수 실행 ( 백준 9184번 )

카카수(kakasoo) 2021. 3. 26. 18:24
반응형

결코 신나지 않았다. 이게 Cpp였다면 솔직히 10분 안에 풀 자신도 있었다.
오류가 발생했다면 아마 다음과 같을 것이다.

배열에 string과 number를 혼용해서 쓰고 있지 않은가?
배열의 사이즈를 적절하게 하지 않아서 메모리가 초과되지 않았는가?
그냥 통째로 문자열로 다루려고 하지 않았는가?
예컨대, "111"를 키 값으로 저장한다던가... 이렇게 하면 문제가 발생한다.
다른 수, 예컨대 "1111"는 "1"과 "1"과 "11"의 조합인지, 아니면 11이 처음이나 중간에 나오는지 어떻게 구별하는가?
메모리가 꼬인다.

const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

rl.on("line", (line) => {
    main(line);
}).on("close", () => {
    process.exit();
});

const memo = {};

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 (memo[a][b][c]) {
        return memo[a][b][c];
    }

    if (a < b && b < c) {
        memo[a][b][c] =
            recursive(a, b, c - 1) +
            recursive(a, b - 1, c - 1) -
            recursive(a, b - 1, c);
    } else {
        memo[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 memo[a][b][c];
};

const main = (line) => {
    if (line === "-1 -1 -1") {
        rl.close();
    }

    const numbers = line.split(" ").map(Number);
    const [a, b, c] = numbers;

    for (let i = 0; i <= 20; i++) {
        memo[i] = [];
        for (let j = 0; j <= 20; j++) {
            memo[i][j] = [];
            for (let k = 0; k <= 20; k++) {
                memo[i][j][k] = null;
            }
        }
    }

    console.log(`w(${a}, ${b}, ${c}) = ${recursive(a, b, c)}`);
};

조건문의 순서에도 주의를 기울이자.

반응형