const permutations = function* (elements, selectNumber) {
if (selectNumber === 1) {
yield elements.map((e) => e);
} else {
const [first, ...rest] = elements;
for (const a of permutations(rest, selectNumber - 1)) {
for (let i = 0; i < elements.length; i++) {
const start = a.slice(0, i);
const ended = a.slice(i);
yield [...start, first, ...ended];
}
}
}
};
const calulate = (a, b, exp) => {
if (exp === "*") return a * b;
else if (exp === "-") return a - b;
else return Number(a) + Number(b);
};
function solution(expression) {
const exp = expression.split(/(\D)/);
let answer = Number.MIN_SAFE_INTEGER;
for (let priority of permutations(["+", "-", "*"], 3)) {
let tmp = [...exp];
for (let x of priority) {
while (tmp.includes(x)) {
let idx = tmp.indexOf(x);
tmp.splice(idx - 1, 3, calulate(tmp[idx - 1], tmp[idx + 1], x));
}
}
answer = Math.max(answer, Math.abs(tmp[0]));
}
return answer;
}
세가지 연산자를 가지고 가능한 순열을 만들었다. 각 순열의 순서를 우선 순위라고 가정하고 탐색을 진행했다.
해당 연산자의 위치를 연산자 + 숫자가 같이 들어있는 배열을탐색하면서 찾고 앞뒤로 같이 빼주고 연산한 것을 그자리에 넣어준다.
splice의 세번째 인자로 해당위치에 값을 넣어줄 수 있다는 것을 알았다.