백준 2504번: 괄호의 값[JS]

Song-Minhyung·2022년 10월 6일
0

Problem Solving

목록 보기
20/50
post-thumbnail

문제

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

(()[]) 와같이 괄호가 주어지면 해당 괄호를 숫자로 치환후 계산을 하는 문제다.
() = 2, [] = 3로 치환후 ()() 이렇게 돼있으면 더하고 (()) 이렇게 중첩됐으면 곱한다.
위의 (()[])(2 + 3) X 2다.

입력

  • 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.

출력

  • 첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다.
  • 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.

첫번째

처음에는 스택을 두개 쓸 생각을 못했다.
그래서 문자열을 넣었다 뺏다 하는 스택 한개, 계산을 위한 스택같은 배열? 이렇게 두개를 썼는데
앞으로 문제를 풀때는 여러 방면으로 생각할 필요가 있을것같다.

두번째 시도

이번엔 처음보다 채점이 꽤 많이 진행됐다. 40%쯤까지 채점이 진행된걸로 기억한다.
여러가지 예외를 생각해봤는데 마지막까지 생각못한 한가지가 있다.
바로 문자열 끝에 괄호가 있는거다.
이 예외는 아래처럼 처리하니 바로 통과했다.

return stack.length > 0 ? 0 : sum;

전체코드

const stdin = (
  process.platform === "linux"
    ? require("fs").readFileSync(0, "utf-8")
    : `(()[[]])([])`
)
  .trim()
  .split("\n");
const input = (() => {
  let line = 0;
  return () => stdin[line++]; //.split(" ").map((v) => +v);
})();

const solution = (inp) => {
  const stack = [];
  const numStack = [];
  const num = { "]": 3, ")": 2 };

  let closeBefore = false;
  let openBefore = false;
  let sum = 0;

  for (let str of inp) {
    // console.log(numStack);
    // 괄호 열기 = stack에 집어넣음
    if (str === "(" || str === "[") {
      if (openBefore) {
        numStack.push(sum);
        sum = 0;
      }
      stack.push(str);
      openBefore = true;
      closeBefore = false;
    }
    // 괄호 닫기 = stack에서 뺌.
    else {
      const pop = stack.pop();

      // 앞의 괄호와 짝이 맞을경우
      if ((str === ")" && pop === "(") || (str === "]" && pop === "[")) {
        // 두번이상 닫는거라면
        if (closeBefore) {
          sum = sum * num[str] + numStack.pop();
        }
        // 처음 닫아보는거라면
        else {
          sum += num[str];
        }
      }
      //짝이 맞지않으면 0 리턴
      else {
        return 0;
      }
      openBefore = false;
      closeBefore = true;
    }
  }
  return stack.length > 0 ? 0 : sum;
};

console.log(solution(input()));
profile
기록하는 블로그

0개의 댓글