PS/백준

백준 / 스택 / 4949번 / 균형잡힌 세상 / JS

KimMinJun 2023. 2. 4. 23:07

< 문제 바로가기 >

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(".")로 끝난다

www.acmicpc.net

 

/* 균형잡힌 세상 */
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : '../input.txt';
// const filePath = process.platform === 'linux' ? '/dev/stdin' : 'BOJ/input.txt';
const input = fs.readFileSync(filePath).toString().trim().split('\n');

input.pop();

function solution(input) {
  let result = [];
  const BRACKET_PAIR = {
    ')': '(',
    ']': '[',
  };

  for (const STRING of input) {
    let stack = [];

    let cur = '';
    for(let i=0; i<STRING.length; i+=1) {
      cur = STRING[i];

      // 괄호가 아니라면 검사 x
      if('()[]'.includes(cur) === false) {
        continue;
      }

      // 여는 괄호라면 stack에 push
      if(Object.values(BRACKET_PAIR).includes(cur)) {
        stack.push(cur);
      }
      // 닫는 괄호라면,
      if(cur in BRACKET_PAIR) {
        // stack의 top과 쌍을 이룬다면 짝이 맞으므로 stack에서 pop
        if(stack.at(-1) === BRACKET_PAIR[cur]) {
          stack.pop();
        }
        // stack의 top과 쌍을 이루지 않는다면 그냥 push
        else {
          stack.push(cur);
        }
      }
    }

    // 짝이 맞아서 다 제거가 되었다면 stack의 길이는 0이므로 'yes'
    result.push(stack.length === 0 ? 'yes' : 'no');
  }

  console.log(result.join('\n'));
}

solution(input);