Algorithm/BOJ

[c++][BOJ] 균형잡힌 세상

kim-hasa 2021. 9. 6. 14:03

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

올바르게 괄호가 쳐져있는지 계산하는 문제입니다.

 

가장 먼저 문자열을 받아오는데, 문자열에서 ( 또는 [ 가 있는 경우에 스택에 넣습니다.

 

이후 ) 또는 ] 를 만나면 스택을 검사해서 가장 위에 있는 글자가 올바른 괄호를 이룬다면, 스택에서 제거합니다.

 

만약 올바르지 않다면, no 를 리턴합니다.

 

끝까지 계산 후, 스택이 비어있다면 yes를 그렇지 않다면 no를 리턴합니다.

#include <iostream>
#include <stack>
#include <string>
using namespace std;

int main(){
    
    while(true)
    {
        string str;
        getline(cin, str);        // 문자열 받아옴
        
        stack<char> s1;            // 스택
        int check = 0;            
        
        if(str == "."){
            break;
        }
        
        for(int i=0; i<str.size(); i++)
        {
            char c = str[i];
            
            if(c == '(' || c== '[')
            {
                s1.push(c);
            }
            else if(c == ')')
            {
                if(s1.empty())
                {
                    check = 1;
                    break;
                }
                else if(s1.top() == '(')
                {
                    s1.pop();
                }
                else
                {
                    check = 1;
                    break;
                }
            }
            else if(c == ']')
            {
                if(s1.empty())
                {
                    check = 1;
                    break;
                }
                else if(s1.top() == '[')
                {
                    s1.pop();
                }
                else
                {
                    check = 1;
                    break;
                }
            }   
        }
        
        if(s1.empty() && check == 0)
        {
            cout << "yes" << endl;
        }
        else
        {
            cout << "no" << endl;
        }
    }
    return 0;
}