연습장/프로그래머스 문제풀이

[프로그래머스 Level 2] 수식 최대화 - JavaScript

Tesseractjh 2022. 9. 16. 12:12

🔗 문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

✏️ 풀이

function solution(expression) {  
    const calculate = (expression, operator) => {
        const regex = new RegExp(`-?\\d+(\\${operator}-?\\d+)+`, 'g');
        return expression.replace(regex, (match) => eval(match.replaceAll('#', '-')));
    };
    
    const operators = ['*', '+', '#'];
    let max = 0;
    
    const dfs = (exp, selected = Array(3).fill(false)) => {
        if (selected.every(Boolean)) {
            max = Math.max(max, Math.abs(Number(exp)));
            return;
        }
        for (let i = 0; i < operators.length; i++) {
            if (selected[i]) {
                continue;
            }
            selected[i] = true;
            dfs(calculate(exp, operators[i]), selected);
            selected[i] = false;
        }
    };
    
    dfs(expression.replaceAll('-', '#'));
    return max;
}

3가지 연산자의 우선순위를 바꿔가면서 나올 수 있는 6가지 경우에 대해 각각 연산을 하고 그 결과를 비교하여 최댓값을 반환하면 되는 문제다.

 

연산은 calculate 함수를 통해 문자열 안에서 특정 연산자 앞 뒤에 있는 피연산자들만을 먼저 계산한 형태의 문자열을 반환하도록 하였다. 이 때, 연산 결과가 음수가 되어 - 문자가 포함될 수 있다. 이렇게 되면 나중에 마이너스 연산자로 연산을 할 때 정규표현식이 연산을 할 부분을 제대로 찾지 못하여 올바르게 연산을 할 수 없게 된다. 그래서 처음부터 마이너스 연산자는 #의 형태로 바꾸고, 계산할 때만 -로 바꾸도록 하였다.