문제
"100-200*300-500+20"
* > + > - 로 연산자 우선순위를 정했을 때, 가장 큰 절댓값을 얻을 수 있습니다.
정답 ) 60420
코드
function solution(expression) {
let answer = 0;
let operands = ['*', '+', '-'];
let priors = [[0, 1, 2], [0, 2, 1],[1, 0, 2], [1, 2, 0],[2, 0, 1],[2, 1, 0]];
for(let i=0; i<priors.length; i++){
let symbols = priors[i].map(p=>{return operands[p]});
let exp_obj = makeArr(expression);
let val = calculate(exp_obj.nums, exp_obj.exps, symbols);
if(val>answer){
answer = val;
}
}
return answer;
}
function makeArr(expression){
let nums = [];
let exps = [];
let j = 0;
for(let i=0; i<expression.length; i++){
if(expression[i]=='-' || expression[i]=='+' || expression[i]=='*'){
nums.push(expression.slice(j, i));
exps.push(expression.slice(i, i+1));
j=i+1;
}
}
nums.push(expression.slice(j, expression.length));
return {nums: nums, exps: exps};
}
function calculate(nums, exps, symbols){
for(let i=0; i<symbols.length; i++){
let symbol = symbols[i];
while(exps.findIndex(exp=>{return exp === symbol}) > -1){
let idx = exps.findIndex(exp=>{return exp === symbol});
exps.splice(idx, 1);
let val_arr = nums.splice(idx, 2);
nums.splice(idx, 0, eval(val_arr[0]+symbol+val_arr[1])+'');
}
}
return Math.abs(Number(nums[0]));
}
후기
방법
- main 함수
['*', '+', '-']로 만들 수 있는 경우의 수 6가지
[[0, 1, 2], [0, 2, 1],[1, 0, 2], [1, 2, 0],[2, 0, 1],[2, 1, 0]]
- makeArr 함수
연산자라면 exp 배열에 push
숫자라면 nums 배열에 push
- calculate 함수
우선 순위가 높은 연산자부터 연산을 수행함
exp 배열 안의 해당 연산자가 모두 사라질 때까지 반복
exp 배열의 해당 연산자의 위치(i)를 구하고 nums[i]와 nums[i+1]를 연산하여 nums[i]에 다시 push
자바스크립트의 eval 메서드를 사용하면 문자열이어도 연산이 가능함
- 경우의 수를 반복하며 가장 큰 수를 찾아 리턴함