공부기록/자바스크립트 코딩테스트

[백준/JS] 1918 후위표기식

_우지 2022. 7. 1. 12:19

 

문제링크

 

1918번: 후위 표기식

첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의

www.acmicpc.net

 

문제풀이

표기법 변환부분을 복습하였다.

2022.06.29 - [공부기록/자바스크립트 코딩테스트] - 중위표기법 후위표기법 변환

 

중위표기법 후위표기법 변환

중위표기법 중위표기법이란 우리가 흔히 쓰는 A + B 와 같이 연산자를 피연산자의 가운데에 표기하는 방법이다. 후위표기법 후위표기법은 컴퓨터가 연산을 처리할때 사용되는 방식인데, 피연산

ehddud100677.tistory.com

 

그리고 이 코드를 참조하였다.

https://velog.io/@enchantee/%EB%B0%B1%EC%A4%80-1918-Python

 

[백준] #1918 Python

백준 1918 파이썬

velog.io

 

코드를 이해하는 과정에서 왜 ' ( ' 괄호까지 while문을 돌아야하지? 라는 궁금증때문에 꽤 고민했다.

(A+B*C+D*E) 예시를 한번 후위표기식으로 바꾸어보자. 그러면 이해가 될 것이다. 

 case "+":
    while (stack.length > 0 && stack[stack.length - 1] != "(") {
      ans += stack.pop();
    }
    stack.push("+");
    break;
case "-":
    while (stack.length > 0 && stack[stack.length - 1] != "(") {
      ans += stack.pop();
    }
    stack.push("-");
    break;

 

전체코드

const fs = require("fs");

BOJkey = 1;

let input = fs
  .readFileSync(BOJkey ? "./자바스크립트로/1918/input.txt" : "./dev/stdin")
  .toString()
  .trim();

let ans = "";
let stack = [];
for (let i = 0; i < input.length; i++) {
  if (input[i].charCodeAt() >= 65 && input[i].charCodeAt() <= 90) {
    ans += input[i];
  } else {
    switch (input[i]) {
      case "(":
        stack.push("(");
        break;
      case "+":
        while (stack.length > 0 && stack[stack.length - 1] != "(") {
          ans += stack.pop();
        }
        stack.push("+");
        break;
      case "-":
        while (stack.length > 0 && stack[stack.length - 1] != "(") {
          ans += stack.pop();
        }
        stack.push("-");
        break;
      case "/":
        while (
          stack.length > 0 &&
          (stack[stack.length - 1] == "/" || stack[stack.length - 1] == "*")
        ) {
          ans += stack.pop();
        }
        stack.push("/");
        break;
      case "*":
        while (
          stack.length > 0 &&
          (stack[stack.length - 1] == "/" || stack[stack.length - 1] == "*")
        ) {
          ans += stack.pop();
        }
        stack.push("*");
        break;
      case ")":
        while (stack.length > 0 && stack[stack.length - 1] != "(") {
          ans += stack.pop();
        }
        stack.pop();
        break;
    }
  }
}
while (stack.length) {
  ans += stack.pop();
}
console.log(ans);

 

다른분 코드 참고

하나 배울점이 있었는데 코드를 참고하신분께서는 정규표현식으로 알파벳을 구분하셨다.

나는 아스키코드값으로 나누는 방식을 택했는데 저렇게도 할 수 있겠구나 또 다시 상기시킬 수 있었다.

if (/[A-Z]/.test(input[i])) printer += input[i]; //다른 분

if (input[i].charCodeAt() >= 65 && input[i].charCodeAt() <= 90) {
    ans += input[i];
  } // 나