[algorithm/ 자료구조 스택 (stack) ] 후위연산식의 연산결과를 출력해라

YS_Study.log·2022년 3월 3일
0

문제 : 후위식 연산식이 주어지면 연산결과를 출력해아

접근방식

  • 후위연산식이 무엇인가? 연산자가 뒤에 있는 식
    ex) 연산식 3(5+2)-9 => 후위연산식으로 표현하면 352+9- 이다.
    => 반대로 후위연산식을 연산식으로 변환하여 계산하면된다.
  • stack 자료구조 방식으로 기본 연산식으로 변환할 수 있다.
    => 숫자요소는 stack[ ]에 모두 담고, 연산자를 만날경우 stack에 담긴 수를 빼내어 해당 연산자로 계산하는 것
    ex) 352+*9- [3,5,2] 담다가 +만나면? 5와 2를 빼서 5 + 2 연산식으로 변경! 계산가능하다.
    => 연산자 중 -, % 때문에 계산할때 연산자 앞뒤의 숫자 순서가 중요한다. 5-2와 2-5는 다르다는 점!

풀이

  1. 계산할 숫자를 담고 뺄 stack 변수를 선언, [] 빈배열을 할당한다.
  2. for문) 모든 str 주어진 수와 연산자를 순서대로 조회한다.
  3. if 조건 1) 조회한 요소가 숫자인 경우? => !isNaN(str[i])
    => stack.push(Number(str[i])로 stack에 수를 반복적으로 담아준다.
    => 이때 문자열 숫자를 Number메소드로 수로 변경해준다.
  4. else 조건 2) 조회한 요소가 연산자인 경우?
    => stack의 맨 위 숫자를, rt = stack.pop() 변수에 담기
    => stack의 그 다음 숫자를 연산자 왼쪽에, lt = stack.pop()
    => rt를 연산자 오른쪽에 lt 를 연산자 왼쪽에 두고 계산한다.
    (이 순서가 중요 ! - , / 할때는 수 위치에 따라 값이 완전 달라진다.)
  5. else 내 if 조건) +, -, /, * 연산자일 경우?
    5-1. stack.push(계산하는 식) => stack []에 계산한 값을 담아준다.
    => 연산자를 만나면 계산한 값에 해당 연산자로 계산하는 식 반복
    ex) [3,5,2], "+" => [3], stack.push(lt(5)+rt(2))
  6. 연산된 모든 값이 담긴 배열의 0번쨰 요소를 리턴한다. stack[0]

      function solution(str) {
        let stack = [];
        for (let i = 0; i < str.length; i++) {
          if (!isNaN(str[i])) {
            stack.push(Number(str[i]));
          } else {
            let rt = stack.pop();
            let lt = stack.pop();

            if (str[i] === "+") stack.push(lt + rt);
            else if (str[i] === "-") stack.push(lt - rt);
            else if (str[i] === "*") stack.push(lt * rt);
            else if (str[i] === "/") stack.push(lt / rt);
          }
        }
        return stack[0];
      }

      let str = "352+*9-";
      console.log(solution(str));
profile
느리지만 조금씩 공부하는 중 입니다. 현재 1년 6개월차 신입입니다 ><!

0개의 댓글