후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.
후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const N = Number(input.shift());
const expression = input.shift();
const stack = [];
let result = 0;
let sh = new Map();
// map의 활용
for (let i = 0; i < expression.length; i++) {
let current = expression[i];
if (current.charCodeAt(0) >= 65 && current.charCodeAt(0) <= 90) {
if (!sh.has(current)) {
//map의 키값이 있는지 확인하고 없으면 set, input의 값을 순서대로 할당한다.
sh.set(current, input.shift());
}
stack.push(sh.get(current)); // 그렇게 할당한 값을 stack에 삽입
} else { // 식에 알파벳이 아니라면? 즉 사칙연산인 경우
let second = Number(stack.pop()); // right
let first = Number(stack.pop()); // left
// 순서가 중요한 이유는 빼기나 나누기 같은 작업떄문
let tempResult = 0; // 결과
switch (current) {
case "+":
tempResult = first + second;
break;
case "-":
tempResult = first - second;
break;
case "/":
tempResult = first / second;
break;
case "*":
tempResult = first * second;
break;
}
stack.push(tempResult);
}
}
console.log(stack[0].toFixed(2)); // 소수 둘째자리까지 출력하는 방법