https://www.acmicpc.net/problem/1935
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);
반응형
'Algorithm' 카테고리의 다른 글
[백준 / NodeJS] 10808번 알파벳 개수 (0) | 2023.04.21 |
---|---|
[백준 / NodeJS] 10820번 문자열 분석 (0) | 2023.04.19 |
[백준 / NodeJS] 1918번 후위 표기식 (0) | 2023.04.12 |
[백준 / NodeJS] 17298번 오큰수 (0) | 2023.04.09 |
[백준 / NodeJS] 10799번 쇠막대기 (0) | 2023.04.05 |