#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 한다.
괄호가 알맞게 짝지어져있다면, 아니면 문자열에 괄호가 없었다면 스택이 비어있어야한다.