📍문제 링크
https://www.acmicpc.net/problem/1918
📍알고리즘 분류
- 자료 구조
- 스택
📍문제 풀이
- 중위 표기식을 후위 표기식으로 바꿔 출력하라
- 곱셈, 나눗셈은 덧셈, 뺄셈보다 우선순위가 높은 연산자이다
📍의사 코드
- 일반 배열과 스택 배열을 만든다
- 주어진 중위 표기식 문자열을 순회하며,
알파벳이면 : 일반 배열에 push
( 이면 : 스택에 push
) 이면 : 스택 배열의 마지막 원소가 (가 나올 때까지 일반 배열에 push
* 또는 / 이면 : 일반 배열에 push
+ 또는 - 이면 : 스택에 있는 연산자들을 모두 pop해서 일반 배열에 넣어주는데, ( 가 나오면 멈춤
📍코드 (JavaScript)
const input = require("fs").readFileSync("/dev/stdin").toString().trim();
const stack = [];
const answer = [];
for (let i = 0; i < input.length; i++) {
if (input[i] >= "A" && input[i] <= "Z") {
answer.push(input[i]);
} else if (input[i] === "(") {
stack.push(input[i]);
} else if (input[i] === "*" || input[i] === "/") {
while (
stack.length > 0 &&
(stack[stack.length - 1] === "*" || stack[stack.length - 1] === "/")
) {
answer.push(stack.pop());
}
stack.push(input[i]);
} else if (input[i] === "+" || input[i] === "-") {
while (stack.length > 0 && stack[stack.length - 1] !== "(") {
answer.push(stack.pop());
}
stack.push(input[i]);
} else if (input[i] === ")") {
while (stack.length > 0 && stack[stack.length - 1] !== "(") {
answer.push(stack.pop());
}
stack.pop();
}
}
while (stack.length > 0) {
answer.push(stack.pop());
}
console.log(answer.join(""));
📍리뷰
- if - else 문 대신 if문 만 사용하는 것이 가독성에 좋다는 글을 본적이 있는데, else if를 통해 조건을 확실하게 구분하는 편이 마음이 편하다..