괄호 문제인 9012번 문제의 업그레이드 버전입니다. 이 문제 또한 스택으로 간단하게 풀 수 있는 문제인데요. 평소 괄호를 사용할 때 어떤 식으로 열고 닫는지 생각해보면 금방 로직을 짤 수 있습니다. 괄호를 닫을 땐 마지막에 열린 괄호와 짝이 맞아야 하며 모든 괄호는 서로 짝을 이루고 있어야 합니다. 문자열 중 '(' 또는 '['가 등장한다면 괄호를 여는 부분이므로 스택에 push를 해주고 ')' 또는 ']'는 괄호를 닫는 부분이므로 현재 스택에 들어간 최상위 원소를 검색하여 짝이 맞는지 확인하면 됩니다. 열고 닫는 부분이 짝이 맞다 하더라도 문자열을 모두 검색하였는데 스택의 사이즈가 0이 아니라면 닫히지 못한 괄호가 있다는 뜻이므로 "no"를 출력하면 됩니다.
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main(void)
{
string str; getline(cin, str);
while (str != ".") {
int len = str.length();
stack<char> stack;
bool chk = true;
for (int i = 0; i < len; i++) {
if (str[i] == '(' || str[i] == '[') stack.push(str[i]);
else if (str[i] == ')') {
if (!stack.empty() && stack.top() == '(') stack.pop();
else {
cout << "no" << endl;
chk = false;
break;
}
}
else if (str[i] == ']') {
if (!stack.empty() && stack.top() == '[') stack.pop();
else {
cout << "no" << endl;
chk = false;
break;
}
}
}
if (chk) {
if (stack.size() != 0) cout << "no" << endl;
else cout << "yes" << endl;
}
getline(cin, str);
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준/C,C++] 17298번: 오큰수 (0) | 2021.03.03 |
---|---|
[백준/C,C++] 1874번: 스택 수열 (0) | 2021.03.03 |
[백준/C,C++] 9012번: 괄호 (0) | 2021.03.02 |
[백준/C,C++] 10773번: 제로 (0) | 2021.03.01 |
[백준/C,C++] 10828번: 스택 (0) | 2021.03.01 |
댓글