본문 바로가기
Algorithm

(BOJ) 4949 풀이

by snwo 2022. 2. 2.
#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(0);cin.tie(0);
    string input;
    while (true)
    {
        stack<int> S;
        int flag = 0;
        getline(cin, input);
        if (input == ".")
            break;
        for (auto &c : input)
        {
            if (c == '(' or c == '[')
                S.push(c);
            else if (c == ')')
            {
                if (!S.empty() && S.top() == '(')
                {
                    S.pop();
                }
                else
                {
                    flag = 1;
                }
            }
            else if (c == ']')
            {
                if (!S.empty() && S.top() == '[')
                {
                    S.pop();
                }
                else
                {
                    flag = 1;
                }
            }
        }
        if(!S.empty())flag=1;
        if (!flag)
            cout << "yes"
                 << "\\n";
        else
            cout << "no"
                 << "\\n";
    }
}

스택을 활용해서 풀 수 있는 문제였다.

공백을 포함해서 입력받아야하기 때문에 getline 을 사용한다.

입력값이 그냥 . 일 때는 break 하면 된다.

 

반복문을 이용해 문자열에서 값을 하나씩 읽어오고,

열린 괄호일 경우에는 스택에 push하고

닫힌 괄호의 경우 일단 비어있는지 검사하고

비어있지 않다면 스택 최상단과 같은 쌍인지 검사한 뒤 pop 한다.

 

괄호가 알맞게 짝지어져있다면, 아니면 문자열에 괄호가 없었다면 스택이 비어있어야한다.