ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JS] postfix를 이용해 실제로 계산하기
    programing/Language 2018. 10. 9. 22:39


    안녕하세요, Einere입니다.


    이번엔 저번에 포스팅했던, postfix를 이용해 실제로 계산하는 코드를 알아보겠습니다.




    전체 코드


    
    function calcul(a, b, oper){
        let result = 0;
        switch(oper){
            case "+":{
                result = a + b;
                break;
            }
            case "-":{
                result = a - b;
                break;
            }
            case "*":{
                result = a * b;
                break;
            }
            case "/":{
                result = a / b;
                break;
            }
        }
        return result;
    }
    
    let priority = new Map();
    priority.set("+", 1);
    priority.set("-", 1);
    priority.set("*", 2);
    priority.set("/", 2);
    
    process.stdin.setEncoding('utf8');
    process.stdin.on('data', data => {
        var line = data.trim()
        let infix = line.split(' ');
        let numbers = [];
        let operators = [];
        let postfix = [];
        
        for(let e of infix){
            //translate to postfix
            //if e is number
            if(!isNaN(parseInt(e, 10))){
                postfix.push(parseInt(e, 10));
            }
            //if e is "("
            else if(e === "("){
                operators.push(e);
            }
            //if e is ")"
            else if(e === ")"){
                while(operators[operators.length - 1] != "("){
                    postfix.push(operators.pop()); 
                }
                operators.pop();
            }
            //if e is operator
            else{
                if(operators.length == 0){
                    operators.push(e);
                }
                else{
                    while(operators.length != 0 && operators[operators.length - 1] != "(" && (priority.get(operators[operators.length - 1]) >= priority.get(e))){
                        postfix.push(operators.pop()); 
                    }
                    operators.push(e);
                }
            }
        }
        while(operators.length != 0){
            postfix.push(operators.pop()); 
        }
    
        console.log(postfix);
    
        //calculate
        for(let e of postfix){
            //if e is number
            if(!isNaN(parseInt(e, 10))){
                numbers.push(e);
            }
            //if e is operator
            else{
                let b = numbers.pop();
                let a = numbers.pop();
                numbers.push(calcul(a, b, e));
            }
        }
        console.log(numbers[0]);
    
    });
    
    

    위의 코드는 한줄씩 입력받아서, postfix와 result를 출력하는 코드입니다.


    사실, postfix로 변환된 수식은 계산하는 것은 매우 쉽습니다.

    숫자는 무조건 numbers스택에 넣고, 연산자는 무조건 numbers스택의 top숫자 2개를 pop해서 연산한 뒤 다시 push해주면 끝이기 때문입니다.


    물론 해당 코드는 전제조건으로 수식은 공백으로 구분되며, 반드시 괄호는 balance하고, 0으로 나누거나 등의 예외가 없는 경우에 한해서만 작동합니다.

    추가적인 예외처리사항이 있다면 해주면 되겠죠?


    여러가지 알고리즘은 잘 모르는 상태에선 매우 구현하기 힘든 것 같습니다.

    코딩테스트에서도 나왔는데, 분명히 배웠던 건데 다시 구현할려니 머리도 안돌아가고.. 막막해서 결국 제출하지 못했습니다..ㅠㅠ

    그래서 오기로 복습하고 구글링하면서 완성했습니다.


    여러분들은 테스트전에 꼭 리뷰해서 안틀리도록 하세요!

    댓글

Designed by black7375.