# 본인 풀이 (실패)
#include<bits/stdc++.h>
using namespace std;
string a = "";
// 괄호 내에서도 짝이 맞는지 확인
bool check(string str){
stack<char> stk;
for(char chr: str){
if (stk.size() && (stk.top() == ']' || stk.top() == ')'))
{
return false;
}
if((stk.empty() && chr == ')') || (stk.empty() && chr == ']')){
return false;
}
if(stk.size() && stk.top() == '(' && chr == ')'){
stk.pop();
}
if(stk.size() && stk.top() == '[' && chr == ']'){
stk.pop();
}
if(chr == '[' || chr == '('){
stk.push(chr);
}
}
if (stk.empty())
{
return true;
}
else
{
return false;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
while(true){
getline(cin, a);
if(a == "."){
break;
}
if(check(a)){
cout << "yes"
<< "\n";
}else{
cout << "no"
<< "\n";
}
}
return 0;
}
- 반례 -
[(]
- 닫는괄호를 확인하는 시점에 대한 코드가 불안정했음. ifelse 분기처리해서 푸시 직전에 top을 확인하여 짝짓기하도록 코드를 개선해야 했음
# 모범 답안
#include<bits/stdc++.h>
using namespace std;
string a = "";
// 괄호 내에서도 짝이 맞는지 확인
bool check(string str){
stack<char> stk;
for(char chr: str){
if(chr == ']'){
if(stk.empty()){
return false;
}
if(stk.size() && stk.top() == '('){
return false;
}else{
stk.pop();
}
}else if(chr == ')'){
if(stk.empty()){
return false;
}
if(stk.size() && stk.top() == '['){
return false;
}else{
stk.pop();
}
}
if(chr == '(' || chr == '['){
stk.push(chr);
}
}
if (stk.empty())
{
return true;
}
else
{
return false;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
while(true){
getline(cin, a);
if(a == "."){
break;
}
if(check(a)){
cout << "yes"
<< "\n";
}else{
cout << "no"
<< "\n";
}
}
return 0;
}