🧠 문제 요약
- 괄호 문자열이 올바른 괄호 문자열(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')를 활용해 상태를 관리하는 방법을 익힘!!
- 코드가 길어지니 헷갈리네;;; 주석을 잘 넣어야 될 것 같다.....어렵네이
반응형
'Study > Coding Test' 카테고리의 다른 글
[BaekJoon] 스택(JavaScript) (1) | 2025.08.26 |
---|---|
[BaekJoon] 숫자 카드2(JavaScript) (1) | 2025.08.25 |
[baekjoon] 카드2(JavaScript) (1) | 2025.08.22 |
[baekjoon] 수 찾기(JavaScript) (0) | 2025.08.21 |
[baekjoon] 체스판 다시 칠하기(JavaScript) (0) | 2025.08.20 |