본문 바로가기

Study/Coding Test

[baekjoon] 괄호(JavaScript)

📘 오늘의 코딩테스트 - 괄호(JavaScript)

🔢 문제 번호: 9012

🔗 문제 링크: 백준 - 괄호

 

 

 

 

🧠 문제 요약

  • 괄호 문자열이 올바른 괄호 문자열(VPS)인지 판단하는 문제
    • 입력: T개의 테스트 케이스, 각 줄마다 괄호 문자열
    • 출력: VPS면 "YES", 아니면 "NO"

 

 

 

✅ 실행 예시 및 결과

입력: 
6
(())())
(((()())()
(()())((()))
((()()(()))(((())))()
()()()()(()()())()
(()((())()(

출력:
NO
NO
YES
NO
YES
NO

 

 

 

✍️ 내 풀이

  • 홀수 길이 문자열은 무조건 "NO"(조기 종료)
  • 스택을 이용해 괄호 매칭 검사
  • '('는 스택에 push(), ')'는 스택에서 pop()
  • 중간에 스택이 비어있는데 ')'가 오면 "NO"
  • 모든 검사 후 스택이 비어있으면 "YES", 아니면 "NO"

 

 

 

💻 내가 푼 코드

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

const T = parseInt(input[0]);
const result = [];

for (let i = 1; i <= T; i++) {
  const parenthesis = input[i];

  // 1단계: 홀수 길이면 무조건 짝이 안 맞으므로 "NO"
  if (parenthesis.length % 2 === 1) {
    result.push("NO");
    continue;
  }

  const stack = []; // 괄호를 저장할 스택
  let isValid = true; // break로 나갔는지 확인용

  // 2단계: 문자열의 각 문자를 하나씩 검사
  for (let char of parenthesis) {
    // 여는 괄호는 스택에 추가
    if (char === "(") {
      stack.push("(");
    } else if (char === ")") {
      // 닫는 괄호인데 매칭될 여는 괄호가 없으면
      if (stack.length === 0) {
        result.push("NO");
        isValid = false;
        break;
      }
      // 매칭되는 여는 괄호 제거
      stack.pop();
    }
  }

  // 3단계: break 안 했으면 스택 상태 확인
  if (isValid) {
    if (stack.length === 0) {
      result.push("YES");
    } else {
      result.push("NO");
    }
  }
}

console.log(result.join("\n"));

 

 

 

📎 남이 푼 코드

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const T = parseInt(input[0]);

for (let i = 1; i <= T; i++) {
    const str = input[i];
    let count = 0;
    let isValid = true;
    
    for (let char of str) {
        if (char === '(') {
            count++;
        } else if (char === ')') {
            count--;
            if (count < 0) {
                isValid = false;
                break;
            }
        }
    }
    
    console.log(isValid && count === 0 ? 'YES' : 'NO');
}
  • 카운터 방식
  • 스택 대신 숫자 하나로 해결
  • '('를 만나면 +1, ')'를 만나면 -1
  • 중간에 음수가 되거나 마지막에 0이 아니며 "NO"
  • 배열 대신 변수 하나만 사용(메모리 효율적)
  • push/pop 연산이 없어서 약간 더 빠름
  • 스택보다는 덜 직관적인 느낌

 

 

 

🔍 회고 & 배운 점

  • 스택 자료구조의 대표적인 활용 예시!!
  • 플래그 변수(내 코드에서는 'isValid')를 활용해 상태를 관리하는 방법을 익힘!!
  • 코드가 길어지니 헷갈리네;;; 주석을 잘 넣어야 될 것 같다.....어렵네이
반응형