섭스토리

백준 4949번 <균형잡힌 세상> 본문

백준 풀이 🍪

백준 4949번 <균형잡힌 세상>

섭웨이 2022. 8. 19. 12:40

백준 4949번 <균형잡힌 세상>

실버 4

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

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


input.pop();

let solve = function (array) {
    let foo = [];
    for (let k of array) {
        if (k === "(") {
            foo.push(k);
        } else if (k === ")") {
            if (foo.length !== 0 && foo[foo.length - 1] === '(') {
                foo.pop();
            } else {
                foo.push(k);
            }
        } else if (k === "[") {
            foo.push(k);
        } else if (k === "]") {
            if (foo.length !== 0 && foo[foo.length - 1] === '[') {
                foo.pop();
            } else {
                foo.push(k);
            }
        }
    }
    if (foo.length !== 0) {
        return "no";
    } else if (foo.length === 0) {
        return "yes";
    }
}

for (let v of input) {
    console.log(solve(v));
}

사실 문자열에 상관없이 "("는 ")"과, "["는 "]"과 매치되는 것을 보는 코드를 짜면 되겠죠?

 

foo라는 배열을 따로 지정해주고 문자열을 앞에서 부터 차례대로 읽어나가면서, 괄호가 들어오면 foo에 push를 하되,

 

닫는 괄호 ")","]" 인 경우에 앞에 "(", "["가 있으면 push하지 않고 뺴도록 짜보았습니다.

 

만약에 닫는 괄호가 먼저 들어오고 여는 괄호가 나중에 들어오면 그대로 foo 안에 쌓이겠죠?

 

[ " ) " , " ( " ] --> 이렇게요. 

 

최종적으로, foo 안에 배열의 요소가 하나도 없어야 균형잡힌 문자열로 인식을 해서, yes를 출력하게 됩니다.

 

얼마전에 자료구조 스터디에서 스택을 배워서 크게 어려움은 없었습니다.

 

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

for (let i = 0; i < a.length; i++) {
    if (a[i] == '.') break
    const s = []
    let b = false
    for (const t of a[i]) {
        if (t == '(' || t == '[') s.push(t)
        if ((t == ')' && s.pop() != '(') || (t == ']' && s.pop() != '[')) b = true
    }
    console.log(b || s.length ? 'no' : 'yes')

다른 분이 입력하신 코드인데요.

 

저랑 대략적인 코드의 흐름은 비슷한데, " || "  비교 연산자를 많이 사용하셔서 가져와봤습니다.

 

마지막 줄을 보면,

console.log(b || s.length ? 'no' : 'yes')

위에서 이미 let b = false 로 선언을 한 상태이구요.

 

"||" 연산자는 앞에 요소가 true면 무조건, 뒤에 요소를 보지도 않고 true를 반환합니다.

 

그러나 이 경우는, 앞에 b가 false기 때문에 s.length 가 true 면 "no"를 출력하고, s.length 가 false 면 "yes"를 출력하게 됩니다.

 

0이 false고, 그 외 숫자는 모두 true 기 때문에, s.length == 0 이면 균형잡힌 문자열이므로 "yes"를 출력,

s에 하나라도 요소가 있으면 균형잡힌 문자열이 아니기 때문에 "no"를 출력하게 됩니다.

'백준 풀이 🍪' 카테고리의 다른 글

백준 10814번 <나이순 정렬>  (0) 2022.08.25
백준 11866번 <요세푸스 문제 0>  (0) 2022.08.25
백준 2798번 <블랙잭>  (1) 2022.08.18
백준 1920번 <수 찾기>  (0) 2022.08.16
백준 1259번 <팰린드롬수>  (0) 2022.08.16