kakasoo

[node.js] 부등호 ( 백준 2529번 ) 본문

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

[node.js] 부등호 ( 백준 2529번 )

카카수(kakasoo) 2021. 8. 3. 18:25
반응형
const readline = require("readline");

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

const input = [];

rl.on("line", (line) => {
    input.push(line);
}).on("close", () => {
    const num = Number(input.splice(0, 1)) + 1;
    const expression = input[0].split(" ");
    const numbers = new Array(10).fill(0).map((el, i) => i);
    const visited = new Array(10).fill(false);

    const answer = [];
    const dfs = (arr = []) => {
        if (arr.length === num) {
            answer.push([...arr]);
            return;
        }

        for (let i = 0; i < numbers.length; i++) {
            const curNumber = numbers[i];
            const lastIdx = arr.length - 1;
            const express = expression[lastIdx];
            if (!visited[i]) {
                if (
                    arr.length === 0 ||
                    new Function(
                        `return ${arr[lastIdx]}${express}${curNumber}`
                    )()
                ) {
                    visited[i] = true;
                    arr.push(curNumber);
                    dfs(arr);
                    arr.pop();
                    visited[i] = false;
                }
            }
        }
    };
    dfs();

    const answerArr = answer.map((el) => Number(el.join("")));
    const maxValue = Math.max(...answerArr);
    const minValue = Math.min(...answerArr);

    const numPad = (number) => {
        let str = String(number);

        while (str.length < num) {
            str = "0" + str;
        }
        return str;
    };
    console.log(numPad(maxValue));
    console.log(numPad(minValue));
});

원래는 순열로 풀려고 했지만, 실패했다.
너무 많은 경우의 수를 고려해야 하기 때문에 시간 초과는 필연적이다. ( 메모리 문제는 제너레이터로 해결한다 쳐도. )
그래서 백트래킹으로 해결했다.

반응형