백준 1935 후위 표기식2

bkboy·2022년 5월 16일
0

백준 초급

목록 보기
9/80

문제

후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.

제한사항

첫째 줄에 피연산자의 개수(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)); // 소수 둘째자리까지 출력하는 방법
  • 추석 참고
  • 아는 문제임에도 입력을 받아오는 것이 복잡해서 헷갈렸다.
profile
음악하는 개발자

0개의 댓글