#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만 비교해서 짜서 더 짧게 하기도 함