완전한 괄호를 이루는 괄호인지를 판별하는 문제입니다.
괄호는 결국 여는 괄호를 닫는 괄호가 알맞게 나오면 되는 문제입니다.
이를 위해 다음과 같이 판별합니다.
- 괄호를 닫을 때 여는 괄호가 있었는지를 확인
- 모든 괄호는 열었을 대 알맞은 갯수의 닫는 갯수가 나와야 하는지 확인
다음과 같은 순서를 지켜야 완전한 괄호를 판별할 수 있다. 2번만을 확인하면 닫는 괄호가 먼저 나오고 여는 괄호가 같은 갯수로 나온다면 이 또한 완전한 괄호로 판별 하기 때문이다.
for (int j = 0;j < bracket.size();j++)
{
if (bracket[j] == ')')
{
if (s.size() == 0)
{
result = 0;
}
else
{
s.pop();
}
}
else
{
s.push('C');
}
}
if (s.size() != 0)
{
result = 0;
}
#include<iostream>
#include<stack>
using namespace std;
stack<char>s;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T = 0;
cin >> T;
int result = 0;
for (int i = 0;i < T;i++)
{
string bracket = "";
cin >> bracket;
result = 1;
for (int j = 0;j < bracket.size();j++)
{
if (bracket[j] == ')')
{
if (s.size() == 0)
{
result = 0;
}
else
{
s.pop();
}
}
else
{
s.push('C');
}
}
if (s.size() != 0)
{
result = 0;
}
if (result == 0)
{
cout << "NO\n";
}
else
{
cout << "YES\n";
}
while (!s.empty())
{
s.pop();
}
}
return 0;
}