스택을 이용하여 알고리즘을 구현했으며, "(" 가 입력되면 스택에 push해주고 ")" 가 입력되면 스택에서 pop해주었다. 그 결과, ")" 가 입력 되었을 때 스택이 비어있거나, 문자열이 끝났을 때 스택에 값이 남아있으면 NO, 그렇지 않으면 YES를 출력해준다.
int main() {
int n;
cin >> n;
while(n--) {
// 문자형 스택 선언
// 스택을 반복문 안에서 선언해줘야 매번 스택이 초기화된다.
stack<char> st;
bool result = true;
string vps;
// 괄호들을 입력받는다 -> ()()()(())
cin >> vps;
for (int i=0; i<vps.size(); i++) {
if (vps[i] == '(') {
// '('가 입력 되었을 때 스택에 '('을 넣어준다
st.push('(');
} else {
// ')'가 입력 되었을 때
if (st.empty()) {
// 스택에 비어있으면, result를 false로 바꿔준다
result = false;
// 반복문을 빠져나간다
break;
} else {
// 스택이 비어져있지 않으면, 가장 위 값을 제거한다.
st.pop();
}
}
}
// 스택이 비어져있지 않으면, result를 false로 바꿔준다
if (!st.empty()) {
result = false;
}
// result가 true면 yes를, false면 no를 출력해준다
if (result) {
cout << "YES" << "\n";
} else {
cout << "NO" << "\n";
}
}
}