[프로그래머스][Level2] 수식최대화

다돔잉·2020년 10월 24일
0

문제

"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]));
}

후기

  • 체감난이도 ★★★
  • 좀 복잡하게 짠 것 같음

방법

  1. main 함수
    ['*', '+', '-']로 만들 수 있는 경우의 수 6가지
    [[0, 1, 2], [0, 2, 1],[1, 0, 2], [1, 2, 0],[2, 0, 1],[2, 1, 0]]
  2. makeArr 함수
    연산자라면 exp 배열에 push
    숫자라면 nums 배열에 push
  3. calculate 함수
    우선 순위가 높은 연산자부터 연산을 수행함
    exp 배열 안의 해당 연산자가 모두 사라질 때까지 반복
    exp 배열의 해당 연산자의 위치(i)를 구하고 nums[i]와 nums[i+1]를 연산하여 nums[i]에 다시 push
    자바스크립트의 eval 메서드를 사용하면 문자열이어도 연산이 가능함
  4. 경우의 수를 반복하며 가장 큰 수를 찾아 리턴함
profile
안녕

0개의 댓글

관련 채용 정보