📍문제 링크
https://www.acmicpc.net/problem/1935
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
📍알고리즘 분류
- 자료 구조
- 스택
📍문제 풀이
- 후위 표기식을 순회하며, 알파벳인 경우 와 연산자인 경우로 나눠서 생각한다.
- 알파벳인 경우 stack에 저장한다.
- 연산자인 경우, stack에서 2개의 수를 꺼내어 연산한뒤 다시 stack에 넣어 준다.
📍의사 코드
- 각 알파벳에 숫자를 바인딩하여 객체로 저장한다. 이를 통해 쉽게 숫자를 꺼내 쓸 수 있다.
- 빈 배열 stack을 만들고, 후위 표기식을 순회하며, 알파벳인 경우 해당하는 숫자를 stack에 push한다.
- 알파벳이 아닌 경우 (연산자인 경우) stack에서 pop한 수 1, pop한 수 2 를 해당 연산자로 연산한 뒤 다시 stack에 push
📍코드 (JavaScript)
const [in1, in2, ...in3] = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const stack = [];
// 각 알파벳에 숫자 저장
const obj = {};
let start = 65;
for (let el of in3) {
obj[String.fromCharCode(start++)] = +el;
}
const createOperation = (operator) => {
const y = stack.pop();
const x = stack.pop();
if (operator === "+") stack.push(x + y);
else if (operator === "-") stack.push(x - y);
else if (operator === "*") stack.push(x * y);
else if (operator === "/") stack.push(x / y);
};
for (let el of in2) {
// 참고1) 조건문 작성 시 주의
if (el === "+" || el === "-" || el === "*" || el === "/") createOperation(el);
else stack.push(obj[el]);
}
console.log(stack[0].toFixed(2));
📍리뷰
- 참고1) 문자열을 순회하며 문자열이 연산자인지 확인할 때 if 문을 확실하게 작성해야 한다.
el === '+' || '-' || '/' || '*' 이렇게 작성하면 스크린이 안된다.
- toFixed() 의 반환값은 문자열이다.