https://programmers.co.kr/learn/courses/30/lessons/67257
1) expression에서 기호들을 추려낸다.
2) 해당 기호들로 permutation 배열을 만들어준다.
3) 해당 배열들을 map을 통해 계산과정을 거쳐준다.
4) 그 중 가장 큰 수를 리턴한다.
function calculate(originalNumSignArr, order){
let numSignArr = originalNumSignArr.slice(0);
for(let i = 0; i < order.length; i++){
for(let j = 0; j < numSignArr.length; j++){
if(numSignArr[j] === order[i]){
if(order[i] === "+"){
numSignArr[j + 1] = numSignArr[j - 1] + numSignArr[j + 1];
numSignArr[j - 1] = "%"
numSignArr[j] = "%"
} else if (order[i] === "-"){
numSignArr[j + 1] = numSignArr[j - 1] - numSignArr[j + 1];
numSignArr[j - 1] = "%"
numSignArr[j] = "%"
} else if (order[i] === "*"){
numSignArr[j + 1] = numSignArr[j - 1] * numSignArr[j + 1];
numSignArr[j - 1] = "%"
numSignArr[j] = "%"
}
}
}
numSignArr = numSignArr.filter(numSign => numSign !== "%")
}
return Math.abs(numSignArr[0]);
}
function getPermutations(arr, selectNumber) {
const results = [];
if (selectNumber === 1) return arr.map((value) => [value]);
arr.forEach((fixed, index, origin) => {
const rest = [...origin.slice(0, index), ...origin.slice(index+1)]
const permutations = getPermutations(rest, selectNumber - 1);
const attached = permutations.map((permutation) => [fixed, ...permutation]);
results.push(...attached);
});
return results;
};
function solution(expression) {
let numArr = expression.split("+").map(exp => exp.split("-")).reduce((acc, cur) => {return acc.concat(cur)}, []).map(exp => exp.split("*")).reduce((acc, cur) => {return acc.concat(cur)}, []).map(num => Number(num))
let signArr = expression.split("").filter(str => str === "+" || str === "-" || str === "*");
let originalNumSignArr = [];
for(let i = 0; i < numArr.length; i++){
originalNumSignArr.push(numArr[i], signArr[i])
}
originalNumSignArr.pop();
let filteredSign = signArr.filter((sign, index) => signArr.indexOf(sign) === index);
let orders = getPermutations(filteredSign, filteredSign.length);
return Math.max(...orders.map(order => calculate(originalNumSignArr, order)));
}
// operator를 따로 만들어 놓고 시작
const operators = [
["*","+","-"],
["*","-","+"],
["+","*","-"],
["+","-","*"],
["-","+","*"],
["-","*","+"],
]
function solution(expression) {
var answer = 0;
let result = [];
// 정규표현식으로 한 번에 깔끔하게 split!
let operand = expression.split(/([+\-*/])/);
operators.forEach(e => {
let rands = [...operand];
e.forEach(operator => {
let newRands = [];
for(let i=0; i<rands.length ; i++){
// 이렇게 옮겨 담는 방식을 생각하면 포문쓰면서 인덱스 밀리는 걸 고민하지 않아도 된다.
if(rands[i] === operator){
let op1 = newRands.pop();
let op2 = rands[i+1];
newRands.push(cal(op1,op2,operator));
i++;
}else newRands.push(rands[i])
}
rands = [...newRands];
})
if(rands.length === 1) result.push(rands[0]);
})
result.sort((a,b)=> Math.abs(b)-Math.abs(a));
return Math.abs(result[0]);
}
function cal(op1,op2,operator){
op1 = Number(op1);
op2 = Number(op2);
switch(operator){
case "*":
return op1*op2;
case "-":
return op1-op2;
case "+":
return op1+op2;
default:
return -1
}
}
e.forEach(operator => {
let newRands = [];
for(let i=0; i<rands.length ; i++){
// 이렇게 옮겨 담는 방식을 생각하면 포문쓰면서 인덱스 밀리는 걸 고민하지 않아도 된다.
if(rands[i] === operator){
let op1 = newRands.pop();
let op2 = rands[i+1];
newRands.push(cal(op1,op2,operator));
i++;
}else newRands.push(rands[i])
}
rands = [...newRands];
})
expression.split(/([+\-*/])/);
정규표현식...!