[알고리즘][JS] stack - 후위식 연산

GY·2021년 12월 16일
0

알고리즘 문제 풀이

목록 보기
73/92
post-thumbnail

💎 문제

후위연산식이 주어지면 연산한 결과를출력하는 프로그램을 작성하세요.
만약 3(5+2)-9를 후위연산식으로 표현하면 352+9-로 표현되며 그 결과는 12입니다.

💎 풀이

const input = '352+*9-';

function solution(input) {
  let stack = [];
  let result = 0;
  const splited = input.split('');
  splited.forEach((el) => {
    if(el === '+') {
      result = parseInt(stack[stack.length - 1]) + parseInt(stack[stack.length - 2]);
      stack.pop();
      stack.pop();
      stack.push(result)
    } else if(el === '-') {
      result = parseInt(stack[stack.length - 2]) - parseInt(stack[stack.length - 1]);
      stack.pop();
      stack.pop();
      stack.push(result)
    } else if(el === '*') {
      result = parseInt(stack[stack.length - 1]) * parseInt(stack[stack.length - 2]);
      stack.pop();
      stack.pop();
      stack.push(result)
    } else if(el === '/') {
      result = parseInt(stack[stack.length - 1]) / parseInt(stack[stack.length - 2]);
      stack.pop();
      stack.pop();
      stack.push(result)
    } else {
      stack.push(el)    
    }
  })
  return stack[0];
}

solution(input);

시간제한을 두고 푸는 데에 집중해봤는데, 한 번에 좋은 코드가 써지지 않아서 아쉽다.
너무 반복되는 코드가 많아 가독성도 좋지 않고 불필요하게 긴 코드가 되었다.
더 간결하고 좋은 풀이를 작성하는 방법은 무엇이 있을까? 더 고민해 볼 필요가 있었다.


다시 풀기

const input = '352+*9-';

function solution(input) {
  let stack = [];
  let result = 0;
  const splited = input.split('');
  splited.forEach((el) => {
    if(!isNaN(el)) stack.push(Number(el));
    else {
      let rt = stack.pop();
      let lt = stack.pop();
      if(el === '+') stack.push(lt + rt);
      else if(el === '-') stack.push(lt-rt);
      else if(el === '*') stack.push(lt*rt);
      else if(el === '/') stack.push(lt/rt);
    }
  }) 
  return stack[0];
}

solution(input);

💎 Review

1. pop()

pop()메서드는 배열에서 마지막 요소를 제거하고. 그 요소를 반환한다.
(이런 부분을 정확하게 알고 있지 못한 느낌이 자꾸들어서, 자주 쓰는 메소드에 대해 다시한번 정리를 해봐야겠다.)
따라서 pop()해준다음 다시 stack[stack.length - 1]로 해당 수를 변수로 지정할 필요가 없었다.
바로 let lt = stack.pop();으로 지정해주면 된다.


2. isNaN()

split()을 사용해준 상태에서 모든 요소는 string 타입으로 배열에 담겨있는데, 어떻게 isNaN으로 숫자인지 아닌지를 구별할 수 있지?

예시를 보자.

isNaN("37");      // 거짓: "37"은 NaN이 아닌 숫자 37로 변환됩니다
isNaN("37.37");   // 거짓: "37.37"은 NaN이 아닌 숫자 37.37로 변환됩니다

string이더라도 숫자형으로 형변환이 가능하다면 isNaN이 아니다.
따라서, isNaN("3")은 false로 3이 숫자라는 것을 식별하고, isNaN("+")은 true로 숫자가 아니라는 것을 식별한다.

유의!
isNaN함수는 혼란스러운 케이스를 가지고 있어 ES15에서 추가된 Number.isNaN()으로 바꾸는 것이 더 적절할 수 있다는 점 기억하자.



Reference

profile
Why?에서 시작해 How를 찾는 과정을 좋아합니다. 그 고민과 성장의 과정을 꾸준히 기록하고자 합니다.

0개의 댓글