https://programmers.co.kr/learn/courses/30/lessons/64064
function solution(expression) {
let signArr = [
['*','+','-'],
['*','-','+'],
['+','*','-'],
['+','-','*'],
['-','*','+'],
['-','+','*'],
]
let answer = 0;
let arr = expression.split("");
console.log(arr);
let numbers = [];
let signs = [];
let tmp = '';
let cnt = 0;
for (let i = 0; i < arr.length; i++) {
let el = arr[i];
if (el == '*' || el == '+' || el == '-') {
numbers.push(parseInt(tmp));
signs.push(el);
tmp = '';
}
else tmp += el;
cnt++;
if (cnt == arr.length) numbers.push(parseInt(tmp));
}
for (let i = 0; i < 6; i++) {
let copyNumbers = Array.from(numbers);
let copySigns = Array.from(signs);
for (let j = 0; j < 3; j++) {
for (let k = 0; k < copySigns.length; k++) {
if (copySigns[k] == signArr[i][j]) {
switch (copySigns[k]) {
case '*':
// console.log(copySigns, copyNumbers)
copyNumbers[k] *= copyNumbers[k + 1];
copyNumbers.splice(k + 1, 1);
copySigns.splice(k, 1);
// console.log(`* : ${copyNumbers}`);
k--;
break;
case '-':
// console.log(copySigns, copyNumbers)
copyNumbers[k] -= copyNumbers[k + 1];
copyNumbers.splice(k + 1, 1);
copySigns.splice(k, 1);
// console.log(`- : ${copyNumbers}`);
k--;
break;
case '+':
// console.log(copySigns, copyNumbers)
copyNumbers[k] += copyNumbers[k + 1];
copyNumbers.splice(k + 1, 1);
copySigns.splice(k, 1);
// console.log(`+ : ${copyNumbers}`);
k--;
break;
}
}
}
}
answer = Math.max(Math.abs(copyNumbers[0]), answer);
}
return answer;
}
let expression = "100-200*300-500+20";
console.log(solution(expression));
우선순위를 나눌 경우의 수가 6개뿐이라 6가지 경우만 약간 노가다식으로 구현하였다.
먼저 부호랑 숫자를 각각 signs와 numbers에 분리 시켰다.
그리고 우선순위 경우의 수 6가지를 돌았다.
시작할 때 먼저 원래상태의 배열들을 복사하고, 먼저 나오는 부호에 따라 먼저 계산해서 copy배열에 넣어준다.
i = 0일 때
signArr = ['*','+','-']
j = 0 일 때 '*', 복사한 sign배열을 돌면서 *를 찾으면 numbers에서 해당위치의 숫자와 그 다음 숫자를 곱한 결과를
넣어준다. 그리고 그 다음위치 숫자는 계산했으니 splice로 삭제.
부호에서도 계산이 끝낫으니 삭제.
copyNumbers[k] *= copyNumbers[k + 1];
copyNumbers.splice(k + 1, 1);
copySigns.splice(k, 1);
부호의 길이가 하나 줄었으니 k--를 해준다.
부호 계산이 끝나고, copyNumbers에 남은 숫자와 answer를 비교하여 더 큰 수를 저장.