알고리즘 공부/미분류

[백준/JS] 2504 괄호의값

_우지 2022. 2. 16. 12:48

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

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.  만일

www.acmicpc.net

문제풀이

1. 올바른 문자열인지 아닌지 체크해준다.

2. 올바른 문자열이라면 다음 step으로, 아니라면 0을 출력한다.

 

3. (()[[]])([]) 이 입력으로 들어왔다고 생각을 하자.

  여기서 아이디어는 ( 2 [3]  위와 같은 식으로 숫자를 저장하는것이다.

 

4.  ) 또는 ] 이 나오게 된다면 앞서 (, [ 이 무조건 나올 것이다. 왜냐하면 이미 올바른 문자열인가를 체크를 한 상태이기 때문이다. 그렇다면  ) 또는 ] 나오게 된다면 그에 맞는 짝을 찾을때 까지 stack을 계속 pop 해준다.

그러면 두가지 케이스를 만날 수 있다.

4-1 앞서 저장해놓은 숫자를 만나는 경우.

4-2 바로 짝을 만나는 경우.

 

4-1 경우에는 tmp 에 숫자는 계속 더해준다. 그리고 마지막에 ) 이라면 2를곱해주고, ]이라면 3을 곱한 값을 stack에 넣는다.

4-2 경우에는 바로 2또는 3을 stack에 넣는다.

 

5-1 마지막은 (()[[]])([]) 같이 크게 두가지 괄호로 나누어진 경우에는  (()[[]]) ([])  위 과정을 거치고 나면 stack에 [숫자, 숫자] 이렇게 저장되어 있으므로 모두 더한 값을 출력한다.

5-2 크게 (()[[]]) 한개의 괄호로 쌓여 있었다면 그대로 tmp를 출력한다.

 

const fs = require("fs");

BOJkey = 0;

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

let stack = [];
let test = [1];

const rightCheck = () => {
  for (let i = 0; i < input.length; i++) {
    if (input[i] == "(" || input[i] == "[") {
      stack.push(input[i]);
    } else {
      if (
        stack.length > 0 &&
        input[i] == ")" &&
        stack[stack.length - 1] == "("
      ) {
        stack.pop();
      } else if (
        stack.length > 0 &&
        input[i] == "]" &&
        stack[stack.length - 1] == "["
      ) {
        stack.pop();
      } else stack.push(input[i]);
    }
  }
  return !(stack.length > 0);
};

let temp = [];
let sum = 0;
if (rightCheck()) {
  for (let i = 0; i < input.length; i++) {
    if (input[i] == "(" || input[i] == "[") {
      stack.push(input[i]);
    } else {
      if (input[i] == ")") {
        temp = [];
        sum = 0;
        while (true) {
          target = stack.pop();
          if (target == "(") {
            if (temp.length == 0) {
              stack.push(2);
            } else {
              temp.map((el) => (sum += el));
              stack.push(2 * sum);
            }
            break;
          } else {
            temp.push(target);
          }
        }
      } else if (input[i] == "]") {
        temp = [];
        sum = 0;
        while (true) {
          target = stack.pop();
          if (target == "[") {
            if (temp.length == 0) {
              stack.push(3);
            } else {
              temp.map((el) => (sum += el));
              stack.push(3 * sum);
            }
            break;
          } else {
            temp.push(target);
          }
        }
      }
    }
  }
  sum = 0;
  stack.map((v) => (sum += v));
  console.log(sum);
} else {
  console.log(0);
}