6-4) 후위식 연산(postfix)

김예지·2021년 9월 2일
0

문제

후위연산식이 주어지면 연산한 결과를 출력하는 프로그램을 작성하세요.
만약 3(5+2)-9 을 후위연산식으로 표현하면 352+9- 로 표현되며 그 결과는 12입니다.
[입력설명]
첫 줄에 후위연산식이 주어집니다. 연산식의 길이는 50을 넘지 않습니다. 식은 1~9의 숫자와 +, -, *, / 연산자로만 이루어진다.
[출력설명]
연산한 결과를 출력합니다.

입력예제 1

352+*9-

출력예제 1

12


문제 풀이

예습 이론

  • if(!isNan(x))이 true라면, x는 숫자이다. 거짓이라면 숫자가 아니다.
  • 전위식과 후위식
    5+3은 전위식이고, 이를 후위식으로 바꾸면 53+이다. 이때, 5와 3은 피연산자이다. +는 상관없지만, -, *, /는 순서가 중요하기 때문에 피연산자의 순서를 잘 작성해줘야한다.

코드

이 문제는 스택을 활용한 문제이다. for(let x of s)를 했을 때, x가 숫자라면 push하고, 숫자가 아니라면(연산자라면) 계산한다. 처음 pop 결과를 rt(오른쪽 피연산자)에, 두번째 pop 결과를 lt(왼쪽 피연산자)에 넣는다. 그 후, 연산자에 따라 계산해서 stack.push해준다. 결국, 최종 결과인 answer은 stack[0]이 된다.

<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(s){  
                let answer;
                stack=[];
                for(let x of s){
                    //숫자가 맞을 때 push
                    if(!isNaN(x)) stack.push(Number(x)); //x는 원래 string이기 때문에 Number으로 바꿈
                    else{
                        let rt=stack.pop(); //먼저 나오는것을 rt에 넣음 
                        let lt=stack.pop(); //두번째로 나오는것을 lt에 넣음 
                        if(x==='+') stack.push(lt+rt);
                        else if(x==='-') stack.push(lt-rt);
                        else if(x==='*') stack.push(lt*rt);
                        else if(x==='/') stack.push(lt/rt);
                    }
                }
                answer=stack[0];
                return answer;
            }

            let str="352+*9-";
            console.log(solution(str));
        </script>
    </body>
</html>
profile
내가 짱이다 😎 매일 조금씩 성장하기🌱

2개의 댓글

comment-user-thumbnail
2021년 9월 13일

9/13
Number(x) 반드시 해줘야함 (이후 연산하기 위해서, 문자를 숫자로 바꾸어야 함)

답글 달기
comment-user-thumbnail
2021년 9월 14일

9/14

let s='35-' 
for(let x of s){
    if(!isNaN(x)) stack.push(Number(x));
}

여기서, x가 3일때, 조건문에서는 true로 판단된다. 즉, x=3일 때 Number로 판단이 되지만
실제로는 x는 문자열이기 때문에, Number(x)화 시켜줘야한다.

답글 달기