흔히 쓰는 괄호가 제대로 열리고 닫혔는지 판단하는 문제입니다. '('가 push, ')'가 pop이라고 생각하면 풀기 수월한 문제입니다. 즉 스택이 비었을때 pop을 하거나 push, pop이 끝난 스택의 사이즈가 0이 아니면 vps가 아닙니다. 그것을 코드로 구현하면.. 아래와 같은 함수를 만들 수 있습니다.
void vps(string str, int len)
{
int stack = 0;
for (int j = 0; j < len; j++) {
if (stack == -1) {
cout << "NO" << endl;
return;
}
if (str[j] == '(') stack++;
else stack--;
}
if (stack != 0) cout << "NO" << endl;
else cout << "YES" << endl;
}
int main(void)
{
int t; cin >> t;
for (int i = 0; i < t; i++) {
string str; cin >> str;
int len = str.length();
if (len % 2 == 0) vps(str, len);
else cout << "NO" << endl;
}
return 0;
}
문자열을 입력받고 길이가 2의 배수가 아니라면 바로 "NO"를 출력합니다. '('와 ')'는 서로 짝이 필요하기 때문에 길이가 홀수라면 vps가 아닐 수밖에 없습니다. 그런 다음 문자열의 각 인덱스(문자)에 접근하여 '('라면 정수를 증가시켜주고 ')'라면 감소시켜줍니다. 문자열을 도는 도중 한 번이라도 정수가 마이너스가 된다면 '('와 ')'는 무조건 '('이 먼저 오는 형태가 되어야 하므로 vps가 아닙니다. 즉 (()))(과 같은 문자열이 입력되었을 때 문자열을 도는 도중 정수가 마이너스가 됩니다. 모든 문자열을 다 돈 후, 정수가 0이 아니라면 짝이 안 맞았다는 소리이므로 "NO"를 출력해주면 됩니다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준/C,C++] 17298번: 오큰수 (0) | 2021.03.03 |
---|---|
[백준/C,C++] 1874번: 스택 수열 (0) | 2021.03.03 |
[백준/C,C++] 4949번: 균형잡힌 세상 (0) | 2021.03.03 |
[백준/C,C++] 10773번: 제로 (0) | 2021.03.01 |
[백준/C,C++] 10828번: 스택 (0) | 2021.03.01 |
댓글