Algorithm

[백준 / NodeJS] 9012번 괄호

cob 2023. 3. 27. 17:20

 

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

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

 

 

 


1. 문제 설명

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다.

여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다. 

 

 

 


2. 입/출력

입출력

 

 


3. 문제 풀이

const [n, ...arr] = require("fs")
  .readFileSync("./input.txt")
  .toString()
  .trim()
  .split(/\r\n/);

//   const [n, ...arr] = require("fs")
//   .readFileSync("/dev/stdin")
//   .toString()
//   .trim()
//   .split(/\n/);

function solution(row) {
  const answer = [];

  row.forEach((item) => {
    const vps = item.split("");

   // 1) stack 생성
    const stack = [];
    let YN = "YES";
    for (let i = 0; i < vps.length; i++) {

      // 2) '('가 들어오면 stack에 쌓는다,
      if (vps[i] === "(") stack.push(vps[i]);

      // 3) ')'가 들어오면 stack에서 뺀다
      else {
        // 4) stack에 담겨있는게 없으면 완성된 괄호를 만들지 못한다.
        if (!stack.pop()) {  
          // 5) 반복문을 빠져 나간다.
          YN = "NO";
          break;
        }
      }
    }

    // 6) 반복문이 끝났는데 stack에 괄호가 남아있다면 미완성된 괄호들이기 때문에 NO를 저장한다.
    if (!!stack.length) YN = "NO";
    answer.push(YN);
  });
  console.log(answer.join("\n"));
}
solution(arr);

 

 

 

반응형