#include <iostream>
#include <stack>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
while(1)
{
int final_flag = 0;
int cnt[2] = {0,0};
stack<char> s;
string str;
getline(cin,str);
if(str == ".")
{
break;
}
for(auto a : str)
{
switch (a)
{
case '(':
{
s.push(a);
cnt[0]++;
break;
}
case ')':
{
int flag=0;
do{
if(s.empty()) {
final_flag = 1;
break;
}
char c = s.top();
s.pop();
if(c == '('){
flag=1;
cnt[0]--;
}
}while(flag != 1);
break;
}
case '[':
{
s.push(a);
cnt[1]++;
break;
}
case ']':
{
int flag=0;
do{
if(s.empty()) {
final_flag=1;
break;
}
char c = s.top();
s.pop();
if(c == '['){
flag=1;
cnt[1]--;
}
}while(flag != 1);
break;
}
}
}
int sum = cnt[0] + cnt[1];
if(sum >0 || final_flag == 1){
cout << "no" << '\n';
}else
{
cout << "yes" << '\n';
}
}
}
- no인 경우는 두가지 이다.
1) 닫힘 괄호가 들어왔을 때 열린 괄호가 없으면 false
(열림 괄호가 있을 때 까지 pop)
2) 열리고 닫히지 않으면 false
(소괄호, 대괄호 열림 괄호 개수를 세는 배열 생성)
- 다른 사람들 풀이를 보면 top만 비교해서 짜서 더 짧게 하기도 함