match()
splice()
function solution(expression) {
const arr = expression.match(/\d+|[*+-]/g);
const priors = [];
const recursion = (src, len, str) => {
if (len === 0) {
priors.push(str);
return;
}
for (let i = 0; i < src.length; ++i) {
recursion(src.replace(src[i], ''), len - 1, str + src[i]);
}
};
recursion('+-*', 3, '');
let result = 0;
for (const prior of priors) {
const tmp = [...arr];
for (const op of prior) {
let i = tmp.indexOf(op);
while (i >= 0) {
tmp.splice(i - 1, 3, calc(tmp[i - 1], tmp[i + 1], op));
i = tmp.indexOf(op);
}
}
if (Math.abs(tmp[0]) > result) result = Math.abs(tmp[0]);
}
return result;
}
function calc(num1, num2, op) {
const [n1, n2] = [num1, num2].map(Number);
switch (op) {
case '+':
return n1 + n2;
case '-':
return n1 - n2;
case '*':
return n1 * n2;
}
}
처음에 중위 연산 이런 것만 보고 트리를 만들어야 하나 고민만 하다가 결국 다른 사람의 풀이를 참고해서 풀었다.
문제를 많이 풀어보고 감을 익혀야 생각이 갇히지 않을 듯...
정규표현식도 점점 익숙해지고 있다. match()
를 이런 식으로 쓴다는 걸 다시 한번 상기할 수 있었다.