본문 바로가기
알고리즘/백준

[백준/C,C++] 4949번: 균형잡힌 세상

by 이민훈 2021. 3. 3.

www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

괄호 문제인 9012번 문제의 업그레이드 버전입니다. 이 문제 또한 스택으로 간단하게 풀 수 있는 문제인데요. 평소 괄호를 사용할 때 어떤 식으로 열고 닫는지 생각해보면 금방 로직을 짤 수 있습니다. 괄호를 닫을 땐 마지막에 열린 괄호와 짝이 맞아야 하며 모든 괄호는 서로 짝을 이루고 있어야 합니다. 문자열 중 '(' 또는 '['가 등장한다면 괄호를 여는 부분이므로 스택에 push를 해주고 ')' 또는 ']'는 괄호를 닫는 부분이므로 현재 스택에 들어간 최상위 원소를 검색하여 짝이 맞는지 확인하면 됩니다. 열고 닫는 부분이 짝이 맞다 하더라도 문자열을 모두 검색하였는데 스택의 사이즈가 0이 아니라면 닫히지 못한 괄호가 있다는 뜻이므로 "no"를 출력하면 됩니다.

#include<iostream>
#include<stack>
#include<string>

using namespace std;

int main(void)
{
    string str; getline(cin, str);
    while (str != ".") {
        int len = str.length();
        stack<char> stack;
        bool chk = true;
        for (int i = 0; i < len; i++) {
            if (str[i] == '(' || str[i] == '[') stack.push(str[i]);
            else if (str[i] == ')') {
                if (!stack.empty() && stack.top() == '(') stack.pop();
                else {
                    cout << "no" << endl;
                    chk = false;
                    break;
                }
            }
            else if (str[i] == ']') {
                if (!stack.empty() && stack.top() == '[') stack.pop();
                else {
                    cout << "no" << endl;
                    chk = false;
                    break;
                }
            }
        }
        if (chk) {
            if (stack.size() != 0) cout << "no" << endl;
            else cout << "yes" << endl;
        }
        getline(cin, str);
    }

    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준/C,C++] 17298번: 오큰수  (0) 2021.03.03
[백준/C,C++] 1874번: 스택 수열  (0) 2021.03.03
[백준/C,C++] 9012번: 괄호  (0) 2021.03.02
[백준/C,C++] 10773번: 제로  (0) 2021.03.01
[백준/C,C++] 10828번: 스택  (0) 2021.03.01

댓글