코딩테스트

[백준] 천재 수학자 성필 (JS)

여유로운 프론트엔드 개발자 2024. 9. 19. 12:08

문제

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

 

평행 세계의 성필은 숫자와 연산자를 만든 당대 최고의 수학자이다. 그리고 놀랍게도 이 숫자와 연산자는 현재 우리가 사용하는 것과 같다. 하지만 수식은 연산자가 피연산자 가운데 위치하는 우리와는 다르게 연산자가 피연산자 뒤에 위치한다고 한다.

우리 세계의 식을 성필의 식으로 바꾸는 방법을 간단히 설명하자면 이렇다. 우선 주어진 식을 연산자의 우선순위에 따라 괄호로 묶어준다. 그런 다음에 괄호 안의 연산자를 괄호의 오른쪽으로 옮겨주면 된다.

예를 들어 a+b*c는 (a+(b*c))의 식과 같게 된다. 그다음에 안에 있는 괄호의 연산자 *를 괄호 밖으로 꺼내게 되면 a+bc*가 된다. 마지막으로 또 +를 괄호의 오른쪽으로 고치면 abc*+가 되게 된다.

천재 수학자 성필은 자신이 만든 이런 간단한 식조차 1초 안에 계산하지 못하는 사람들을 위하여 답을 구해주는 프로그램을 개발하려고 했지만 아쉽게도 성필의 세계에는 프로그래밍 언어가 없다. 프로그래밍을 할 수 있는 우리가 성필을 위해 평행세계의 식을 계산하는 프로그램을 만들어주자.


입력
길이가 100이 넘지 않는 수식이 예제 입력과 같이 공백 없이 입력된다. 수식은 0부터 9까지의 숫자와 연산자 '+', '-', '*', '/' 로만 이루어져 있다.

또한, 수식의 계산 중간 과정의 모든 결과는 항상 2,147,483,647을 넘지 않는 정수이고 0으로 나누는 경우는 없습니다.

잘못된 수식이 입력되는 경우도 없습니다.

출력
입력으로 주어진 성필의 수식의 답을 첫째 줄에 출력한다.

풀이

1. 반복문을 수행하면서 숫자들을 operand 배열에 push 한다.

2. 연산자를 만날 경우 배열에서 두 수를 꺼내 계산 후 다시 operand 배열에 push한다.

3. 반복문이 끝나면 operand 배열엔 최종 계산된 값만 남는다.

const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString();

Solution = (input) => {
  const operand = [];

  for (let i = 0; i < input.length; i++) {
      if (!("+-*/".includes(input[i]))) {
          operand.push(Number(input[i]));
      } else {
          const num2 = operand.pop();
          const num1 = operand.pop();
          switch (input[i]) {
              case "+":
                  operand.push(num1 + num2);
                  break;
              case "-":
                  operand.push(num1 - num2);
                  break;
              case "*":
                  operand.push(num1 * num2);
                  break;
              case "/":
                  operand.push(num1 / num2);
                  break;
          }
      }
  }

  console.log(operand[0]);
};

Solution(input);

 

결론

스택 문제이다.

계산한 결과 값을 다시 스택에 push 해주면 후위연산 결과를 구할 수 있다.

'코딩테스트' 카테고리의 다른 글

[백준] 폴리오미노 (JS)  (0) 2024.09.26
[백준] 뒤집기 (JS)  (2) 2024.09.22
[백준] 콘테스트 (JS)  (0) 2024.09.18
[프로그래머스] 동영상 재생기 (JS)  (0) 2024.09.16
[프로그래머스] 스킬트리 (JS)  (0) 2024.09.12