후위연산식이 주어지면 연산한 결과를출력하는 프로그램을 작성하세요.
만약 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);
pop()메서드는 배열에서 마지막 요소를 제거하고. 그 요소를 반환
한다.
(이런 부분을 정확하게 알고 있지 못한 느낌이 자꾸들어서, 자주 쓰는 메소드에 대해 다시한번 정리를 해봐야겠다.)
따라서 pop()해준다음 다시 stack[stack.length - 1]로 해당 수를 변수로 지정할 필요가 없었다.
바로 let lt = stack.pop();으로 지정해주면 된다.
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()으로 바꾸는 것이 더 적절할 수 있다는 점 기억하자.