연습장/백준(BOJ) 문제풀이

[백준 4949] 균형잡힌 세상 with Node.js

Tesseractjh 2021. 4. 17. 15:42

문제 링크

www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

풀이

const arr = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
const open = ["(", "["];
const closed = [")", "]"];
let stack;
const yesno = [];
arr.slice(0, arr.length-1).forEach(v => {
    let isNo = false;
    stack = [];
    for (let i=0; i<v.length; i++) {
        if (open.includes(v[i])) stack.push(v[i]);
        else if (closed.includes(v[i])) {
            if (stack.pop() !== open[closed.indexOf(v[i])]) {
                yesno.push("no");
                isNo = true;
                break;
            }
        }
    }
    if (!isNo) {
        if (stack.length === 0) yesno.push("yes");
        else yesno.push("no");
    }
});
console.log(yesno.join("\n"));

문자열을 순회하면서 여는 괄호가 나오면 stack에 push한다. 닫는 괄호가 나오면 pop한 뒤 그 반환값이 짝이 맞는 여는 괄호가 아니면 no를 출력한다. 이 과정이 끝난 뒤에도 (()[], ()[ 이런식의 입력을 받았다면 여는 괄호 하나가 남아 stack이 비어 있지 않을 수 있다. stack이 비어 있으면 yes를 출력, 비어 있지 않으면 no를 출력한다.