[プログラマ#JS]最大化式



[リンク]


https://programmers.co.kr/learn/courses/30/lessons/67257

[回答]

  • for文を演算子(+,-,*)が持つことができる数に変換します.
  • 中位マーキング法をポストマーキング法に変換します.
  • for文をi=0から式文字列の長さに移動します.
  • [文字が演算子である場合]スタックでは、優先度が自分の演算子以上を接尾辞タグ法にタグ付けし、演算子をスタックに配置します.
  • (文字が演算子でない場合)は、接尾辞マーキング法にマーキングされます.
  • スタックの残りの文字列を接尾辞マーキング法にマーキングします.
  • 演算
  • 接尾辞表現.
  • for文をi=0から接尾辞マーキング法の長さに変更します.
  • [文字列が演算子の場合]スタックから2つの数値を取り出し、計算して入れます.
  • [文字列が演算子でない場合]スタックに格納されます.
  • の各ケースの数値の結果値を比較し、最大値を返します.
  • [コード]

    const prioritys = [{'+':0, '-':1, '*':2}
                      ,{'+':2, '-':0, '*':1}
                      ,{'+':1, '-':2, '*':0}
                      ,{'+':0, '-':2, '*':1}
                      ,{'+':1, '-':0, '*':2}
                      ,{'+':2, '-':1, '*':0}];
                      
    function solution(expression) {
        let answer = 0;
        for(const priority of prioritys) {
            let postfix = [''];
            const stack = new Array();
            
            /* 중위표기법 -> 후위표기법 변환 */
            for(let i = 0; i < expression.length; i++) {
                if(expression[i] == '+' || expression[i] == '-' || expression[i] == '*') {
                    while(stack.length) {
                        let top = stack.pop();
                        if(priority[expression[i]] <= priority[top]) {
                            postfix.push(top);
                        } else {
                            stack.push(top);
                            break;
                        }
                    }
                    stack.push(expression[i]);
                    postfix.push('');
                } else {
                    let temp = postfix.pop();
                    postfix.push(temp + expression[i]);
                }
            }
            while(stack.length) {
                postfix.push(stack.pop());
            }
            
            /* 후위표기법 연산 */
            for(let i = 0; i < postfix.length; i++) {
                if(postfix[i] == '+') {
                    stack.push(stack.pop() + stack.pop());
                } else if(postfix[i] == '-') {
                    let b = stack.pop();
                    let a = stack.pop();
                    stack.push(a - b);
                } else if(postfix[i] == '*') {
                    stack.push(stack.pop() * stack.pop());
                } else {
                    stack.push(parseInt(postfix[i]));
                }
            }
            answer = Math.max(answer, Math.abs(stack.pop()));
        }
        return answer;
    }