JS 알고리즘 문제풀이/섹션 6. 자료구조(스택, 큐)

4.후위식 (postfix) 연산(스택)

crab. 2022. 6. 25. 07:51

📌강의 정리

주어진 문자열에서 반복문으로 하나씩 뽑아 isNaN을 써서 숫자이면

스택에 넣어주고 문자이면 pop 2번과 조건문 4개를 이용해 계산하여 스택에 넣어준다.

스택에 남은 한개의 숫자가 답이다.

 

📌느낀점

나는 쉬운 문제를 굳이 함수를 써서 어렵게 풀었다.

가끔은 복잡하다 생각되는 풀이가 사실은 간단한 풀이일 수도 있기에 좀 더 깊게 생각해보는 것이

필요한 것 같다. 또한 isNaN의 쓰임새도 잘 생각해두어야 겠다.

 

//나의코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function calculate(n1, operator, n2) {
        let result = 0;
        if (operator === "+") {
          result = n1 + n2; // '+'버튼을 눌렀을 때
        } else if (operator === "-") {
          result = n1 - n2; // '-'버튼을 눌렀을 때
        } else if (operator === "*") {
          result = n1 * n2; // '*'버튼을 눌렀을 때
        }
        if (operator === "/") {
          result = n1 / n2; // '/'버튼을 눌렀을 때
        }
        return result;
      }
      function solution(s) {
        let answer;
        let stack = [];
        let tmp1 = 0;
        let tmp2 = 0;
        for (let i = 0; i < s.length; i++) {
          if (Number(s[i]) >= 0 && Number(s[i]) <= 9) stack.push(Number(s[i]));
          else {
            tmp1 = stack.pop();
            tmp2 = stack.pop();
            stack.push(calculate(tmp2, s[i], tmp1));
          }
        }
        answer = stack[0];
        return answer;
      }
      //후위식 연산은 스택을 만들고 숫자들을 쌓다가
      //연산자가 쌓이면 바로 전과 그 전전의 숫자를 연산자로 계산하여
      //스택에 쌓아준다.
      //문자열반복이 끝났을때 스택에 남은 숫자가 연산의 결과이다.
      let str = "352+*9-";
      console.log(solution(str));
    </script>
  </body>
</html>
//강사님 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(s) {
        let answer;
        let stack = [];
        for (let x of s) {
          if (!isNaN(x)) stack.push(Number(x));
          else {
            let rt = stack.pop();
            let lt = stack.pop();
            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>