[203] 1935 후위표기식2

younoah·2021년 11월 13일
0

[백준-기초]

목록 보기
12/29

1935 후위표기식2

문제

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

입력

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. (3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 정수이다)

출력

계산 결과를 소숫점 둘째 자리까지 출력한다.

예제 입력 1 복사

5
ABC*+DE/-
1
2
3
4
5

예제 출력 1 복사

6.20

예제 입력 2 복사

1
AA+A+
1

예제 출력 2 복사

3.00

코드

//---- 세팅 ----//
const fs = require('fs');
const stdin = (
  process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `\
5
ABC*+DE/-
1
2
3
4
5
`
).split('\n');

const input = (() => {
  let line = 0;
  return () => stdin[line++];
})();

//---- 풀이 -----//

const n = Number(input());
const formulaArr = input().split('');
const numberObj = [];
let startCode = 65;
const stack = [];

for (let i = 0; i < n; i++) {
  numberObj[String.fromCharCode(startCode)] = Number(input());
  startCode++;
}

const command = {
  '+': (a, b) => a + b,
  '-': (a, b) => a - b,
  '*': (a, b) => a * b,
  '/': (a, b) => a / b,
};

formulaArr.forEach(v => {
  if ('A' <= v && v <= 'Z') stack.push(numberObj[v]);
  else {
    const b = stack.pop();
    const a = stack.pop();
    stack.push(command[v](a, b));
  }
});

console.log(stack[0].toFixed(2));

풀이

알파벳에 상응하는 값을 담고있는 맵과, 연산에 대응하는 맵을 준비한다.

한글자 씩 돌면서

  • 숫자이면 스택에 집어넣는다.
  • 연산이면 스택에서 두개의 값을 pop한후 연산하고 다시 stack 집어넣는다.

최종적으로 스택에 남은 값이 연산결과이다.

참고 블로그

참고자료

profile
console.log(noah(🍕 , 🍺)); // true

0개의 댓글