후위 연산식(Reverse Polish Notation)의 각 요소가 들어있는 배열 tokens
연산식을 계산하여 결과값 반환
0으로 나누는 일은 없지만, 나눗셈 결과는 0에 가깝게 소수점 처리
/**
* @param {string[]} tokens
* @return {number}
*/
var evalRPN = function(tokens) {
let stack = [];
for (let i = 0; i < tokens.length; i++) {
let token = tokens[i];
if (isNaN(parseInt(token))) {
const a = stack.pop();
const b = stack.pop();
if (token === '+')
stack.push(a + b);
else if (token === '-')
stack.push(b - a);
else if (token === '*')
stack.push(a * b);
else if (token === '/') {
let num = b / a;
stack.push(num < 0 ? Math.ceil(num) : Math.floor(num));
}
} else
stack.push(parseInt(token));
}
return stack[0];
};
tokens 배열을 돌면서 현재 요소가 숫자면 문자를 숫자로 변환해 스택에 저장
연산기호라면 스택에서 두 개의 요소를 꺼내온 뒤 연산자에 맞게 계산
두번째로 꺼내온 것이 식에서는 앞에 위치하므로 뺄셈이나 나눗셈은 b가 왼쪽
특히 나눗셈 결과를 0에 가깝게 소수점 처리해야 하므로
결과가 0보다 작다면 올림, 0보다 크다면 내림
연산 결과는 다시 stack에 저장
순회가 끝나면 하나의 요소만 남을 것이고, 인덱스 0 값 반환
Accepted
Runtime 54ms (Beats 89.34%)
Memory 51.44MB (Beats 89.02%)
스택 문제라고 하면 빠질 수 없는 후위 연산식이었기 때문에 어려움 없이 풀 수 있었다. 다만 나눗셈 결과가 0에 가깝게라는 조건이 있어서 처음에는 무슨 말인가 싶었는데 냅다 floor를 했더니 테스트케이스에 걸려서 깨달을 수 있었다. 연산기호 4가지를 모두 if-else로 넣다보니 깔끔하지 않은 느낌이 있긴 한데, switch 문으로 하자니 모든 case 마다 break를 걸어야 해서 그게 그거인 느낌이었다. 어떤 사람들은 저 부분을 function으로 만들어서 case 마다 return 으로 끝내기도 하더라.