[Stack] Evaluate Reverse Polish Notation

Yongki Kim·2023년 8월 29일
0
post-thumbnail

150. Evaluate Reverse Polish Notation

지문은 링크에서 확인해주세요.

1. 해답을 보지 않고 스스로 문제를 해결한 과정

/**
 * @param {string[]} tokens
 * @return {number}
 
 * Runtime	: 64 ms
 * Memory	: 45.17 MB
 */
var evalRPN = function(tokens) {
  const stack = [];

  for(const token of tokens) {
    if(!isNaN(token)) {
      stack.push(Number(token));
    }else {
      const opd2 = stack.pop();
      const opd1 = stack.pop();      

      switch(token) {
        case "+":
          stack.push(opd1 + opd2);
          break;
        case "-":
          stack.push(opd1 - opd2);
          break;
        case "*":
          stack.push(opd1 * opd2);
          break;
        case "/":
          stack.push(~~(opd1 / opd2));
          break;
      }      
    }
  }

  return stack.pop();
};

number 타입을 확인하기 위해 Number 생성자를 사용하는 것보다 Number.isNaN 메소드를 사용하는 것이 정확한 점을 알게 되었습니다.

2. 여러 해답을 직접 찾아서 자신이 작성한 알고리즘에 대해서 회고한 내용

2-1. Using operator hash table

해답의 전문은 링크를 확인해주세요.

/*
 * Runtime	: 64 ms
 * Memory	: 44.24 MB
 */
var evalRPN = function(tokens) {

  const operations = {
      '+': function(a, b) { return parseInt(a) + parseInt(b) },
      '-': function(a, b) { return parseInt(a) - parseInt(b) },
      '*': function(a, b) { return parseInt(a) * parseInt(b) }, 
      '/': function(a, b) { return parseInt(a) / parseInt(b) }
  }

  let i = 0
  while (tokens.length > 1) {
    if (tokens[i] in operations) {
      const operation = operations[tokens[i]]
      tokens[i] = operation(tokens[i - 2], tokens[i - 1])
      tokens.splice(i - 2, 2)
      i -= 2
    }
    i++
  }

  return Math.floor(tokens[0])
};

연산자 토큰을 키, 연산자에 따른 함수를 값으로 가지는 JS 객체를 활용한 점이 인상적이었습니다. 필자의 해답의 switch 문을 대체해서 사용할 수 있습니다.

0개의 댓글