Algorithm

[백준 / NodeJS] 1935번 후위 표기식2

cob 2023. 4. 14. 18:24

 

 

https://www.acmicpc.net/problem/1935

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

 

 


1. 문제 설명

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

 

 


2. 입출력

입출력

 

 

 

 


3. 문제 풀이

알파벳 여부 판단 => 알파벳일 경우 stack에 피연산자를 담는다 => 아닌 경우 연산자로 stack에 담긴 값을 가져와 계산한다.
중위 표기식
우리가 보통 사용하는 표기식을 중위 표기식이라고 한다.
2*3와 같이 피연산자 사이에 연산자를 두는 방법

후위 표기식
연산자를 피연산자 뒤에 놓는 방법을 후위 표기식이라 한다.
중위 표기식을 2*3을 후위 표기식 23*라고 바꿀 수 있다.

 

const [n, ...arr] = require("fs")
  .readFileSync("./input.txt")
  .toString()
  .trim()
  .split(/\r\n/);

//const [n, ...arr] = require("fs").readFileSync("/dev/stdin").toString().trim().split(/\n/);
function solution(arr) {
  const stack = [];      // 값을 담을 stack 선언
  const map = new Map(); // 알파벳당 숫자 담을 Map 객체 선언

  let cnt = 1; // 피연산자 위치 
  for (let i = 0; i < arr[0].length; i++) {
    // 1) 알파벳인 경우
    if (/[A-Z]/.test(arr[0][i])) {
      // 2) map에 있는 경우
      if (map.has(arr[0][i])) {

        // 3) 기존 map에 담겨있는 값을 가져와 stack 담는다.
        stack.push(map.get(arr[0][i]));
      } else {

        // 4) map에 없는 경우, map과 stack에 알파벳을 넣는다.
        map.set(arr[0][i], Number(arr[cnt]));
        stack.push(Number(arr[cnt]));
        // 5) 피연산자 위치 증가
        cnt++;
      }
    } else {
      // 6) 알파벳이 아닌 경우 연산자로 이므로 stack 값을 가져와 계산한다.
      const a = stack.pop(), b = stack.pop();
      stack.push(eval(b + arr[0][i] + a));
    }
  }
  // 7) 마지막 남은 stack 값이 최종 계산한 값
  console.log(stack.pop().toFixed(2));
}
solution(arr);
반응형