본문 바로가기
Algorithm/프로그래머스[Programmers]

[JS] 2020카카오 : 수식 최대화 프로그래머스 LEVEL2

by jgo 2022. 6. 22.

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/67257

풀이 전략

단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다.
수식에 포함된 연산자가 2개라면 정의할 수 있는 연산자 우선순위 조합은 2! = 2가지이며, 연산자가 3개라면 3! = 6가지 조합이 가능합니다.
만약 계산된 결과가 음수라면 해당 숫자의 절댓값으로 변환하여 제출하며 제출한 숫자가 가장 큰 참가자를 우승자로 선정하며, 우승자가 제출한 숫자를 우승상금으로 지급하게 됩니다.
"-56+100"처럼 피연산자가 음수인 수식도 입력으로 주어지지 않습니다.
같은 연산자끼리는 앞에 있는 것의 우선순위가 더 높습니다.

코드 

function solution(expression) {
    const operPriority = [
        ["+", "-", "*"],
        ["+", "*", "-"],
        ["-", "+", "*"],
        ["-", "*", "+"],
        ["*", "+", "-"],
        ["*", "-", "+"],
    ];
    const cal = {
        "+": (a, b) => a + b,
        "-": (a, b) => a - b,
        "*": (a, b) => a * b,
    };
    let answer = 0;
    const num = expression.split(/[^0-9]/).map(Number);
    const operation = [];
    for (const char of expression) {
        if (char === "+" || char === "-" || char === "*") operation.push(char);
    }
    const operlen = operation.length;

    for (let i = 0; i < 6; i++) {
        const copyNum = num.slice();
        const copyOper = operation.slice();

        for (let j = 0; j < 3; j++) {
            for (let k = 0; k < operlen; k++) {
                if (copyOper[k] !== operPriority[i][j]) continue;
                const oper = copyOper[k];
                copyNum[k] = cal[oper](copyNum[k], copyNum[k + 1]);
                copyNum.splice(k + 1, 1);
                copyOper.splice(k, 1);
                k--;
            }
        }
        answer = Math.max(answer, Math.abs(copyNum[0]));
    }
    return answer;
}

 

회고

스킬체크로 나왔을 때는 dfs로 순열을 하나하나 확인해야 하는 줄 알았는데, 다른분들의 풀이를 보니 미리 6개의 case를 설정하여서 이를 모두 순회하는 방식으로 풀어나가셨다. 이러한 생각을 하는 것이 중요한 것 같다. 문제를 읽고 6개의 케이스로 나누어 생각하고, split,splice,slice와 같은 method들의 기능과 응용방법들을 잘알아두면 좋을 듯 하다. 

참고한 블로그1
참고한 블로그2

 

더 좋은 방법이나 의견이 있으시다면 댓글 부탁드립니다 :)

댓글