🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/67257
✏️ 풀이
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 함수를 통해 문자열 안에서 특정 연산자 앞 뒤에 있는 피연산자들만을 먼저 계산한 형태의 문자열을 반환하도록 하였다. 이 때, 연산 결과가 음수가 되어 - 문자가 포함될 수 있다. 이렇게 되면 나중에 마이너스 연산자로 연산을 할 때 정규표현식이 연산을 할 부분을 제대로 찾지 못하여 올바르게 연산을 할 수 없게 된다. 그래서 처음부터 마이너스 연산자는 #의 형태로 바꾸고, 계산할 때만 -로 바꾸도록 하였다.
'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스 Level 2] 두 큐 합 같게 만들기 - JavaScript (0) | 2022.09.17 |
---|---|
[프로그래머스 Level 2] 행렬 테두리 회전하기 - JavaScript (0) | 2022.09.16 |
[프로그래머스 Level 2] 괄호 변환 - JavaScript (0) | 2022.09.15 |
[프로그래머스 Level 2] 메뉴 리뉴얼 - JavaScript (0) | 2022.09.15 |
[프로그래머스 Level 2] 튜플 - JavaScript (0) | 2022.09.15 |