#include <bits/stdc++.h>
using namespace std;
stack<char> st;
string s;
bool check(string a){
while(st.size()){
st.pop();
}
for(char c : a){
if(c == '(' || c==')' || c=='[' || c==']'){
if(!st.empty() && c == ')' && st.top() == '(') st.pop();
else if(!st.empty() && c == ']' && st.top() == '[') st.pop();
else st.push(c);
}
}
if(st.empty()) return true;
else return false;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
while(1){
getline(cin, s);
if(s == ".")break;
if(check(s)) cout << "yes\n";
else cout << "no\n";
}
}
띄어쓰기가 포함된 문자열을 받아야 하므로 getline을 받아준다.
'.'이면 break 해줘야한다. 이때 string 이므로 쌍 따옴표를 쓰지 않으면 오류가 났다.
main 함수 내에서 하나씩 조건 걸고 check 할 수도 있지만 깔끔하게 새로운 함수를 만들었다.
check 함수는 문자열이 괄호일때만 검사를 하는데 ')' ']'가 비어있지 않은 스택에서 짝을 지으면 pop 아니면 push해서 마지막에 비어있으면 true 아니면 false를 반환한다.
중요한건 stack을 청소해줘야 다음 문자열이 들어왔을때 오류가 안난다.
그래서 처음에 stack 청소를 하고 시작한다.
stack을 사용할 줄 안다면 어렵지 않은 문제였다.