지문은 링크에서 확인해주세요.
/**
* @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 메소드를 사용하는 것이 정확한 점을 알게 되었습니다.
해답의 전문은 링크를 확인해주세요.
/*
* 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 문을 대체해서 사용할 수 있습니다.