백준 31458번 !!초콜릿 중독 주의!! Node.js

찌니월드·6일 전
0

항해 99클럽 TIL

목록 보기
3/7

문제

코코의 초콜릿 가게에서 파는 초콜릿은 달달하기로 유명하다. 그래서 코코는 아래와 같은 경고문을 가게 앞에 붙이려고 한다.

!!초콜릿 중독 주의!!

이 문구를 유심히 보던 코코는 느낌표 사이의 문장을 지우고 그 자리에 수를 넣으면 일종의 수식이 된다는 사실을 깨달았다. 이 수식을 계산해 보자.

이 문제에서 계산할 수식은 정수 하나와 00개 이상의 느낌표로 이루어져 있다. 정수는 00 또는 11이며, 느낌표는 정수의 앞이나 뒤에 올 수 있다. 이 수식을 계산하는 규칙은 다음과 같다.

  • n!n!nn의 팩토리얼이다. 0!=10!=1, 1!=11!=1로 정의된다.

  • !n!nnn의 논리 반전(logical not)이다. !0=1!0=1, !1=0!1=0으로 정의된다.

  • 팩토리얼이나 논리 반전이 중첩되어 있으면 중첩된 횟수만큼 계산하며,
    !n!!n!과 같이 둘 다 사용된 경우에는 팩토리얼을 먼저 계산한다. 예를 들어,
    !!n!!=!(!((n!)!))!!n!!=!(!((n!) !))이다.

입력

첫 번째 줄에는 수식의 개수 TT가 주어진다. (1T1000)(1\le T\le 1\, 000)

두 번째 줄부터 TT개의 수식이 한 줄에 하나씩 주어진다. 하나의 수식은 aa개의 느낌표, 정수 nn, bb개의 느낌표가 공백 없이 순서대로 합쳐진 형태이다. (0a,b30;(0\le a,b\le 30; 0n1)0\le n\le 1)

출력

각 수식을 계산한 결과를 한 줄에 하나씩 출력한다.

예제 입력 1

6
0!
1!
!0
!1
!!0!!
!!1!!

예제 출력 1

1
1
1
0
1
1

나의 풀이

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

const t = +input[0];
const sH = new Map([
  ["0!", 1],
  ["1!", 1],
  ["!0", 1],
  ["!1", 0],
]);

for (let i = 1; i <= t; i++) {
  const str = input[i];
  const stack = [];

  for (let char of str) {
    if (stack.length > 0 && stack[stack.length - 1] !== "!") {
      if (char === "!") stack.push(sH.get(stack.pop() + "!"));
    } else stack.push(char);
  }

  while (stack.length > 1) {
    const num = stack.pop();
    const char = stack.pop();
    stack.push(sH.get(char + num));
  }

  console.log(stack.pop());
}
profile
Front-End Developer

0개의 댓글

관련 채용 정보