작성
·
246
1
#include<bits/stdc++.h>
using namespace std;
string a;
bool check(string s) {
// (과 [를 담을 stack
stack<char> cstk;
//만약 ([이면 무조건 담고 그렇지 않은 경우들 체크 , 문자들이 들어가기 때문에 특정 조건에 맞는 선언으로 해야한다. else를 쓰지 않는 방향으로
for(char c : s ) {
if( c == '(' || c == '[') cstk.push(c);
// 현재 c가 ), ] 인데 stck이 비어있으면 return false;
if( (c == ')' || c == ']') && cstk.empty()) return false;
// 여기서 위의 조건의 else가 아닌 두가지 경우로 특정지었다.
if( c == ')'){
if(cstk.top() == '(') cstk.pop();
else return false;
}
if( c == ']') {
if(cstk.top() == '[') cstk.pop();
else return false;
}
}
// 다 돌았는데 아무문제없이 cstk.empty면
return cstk.empty();
}
int main () {
while(true) {
// cin과 다른점은 띄어쓰기도 아스키코드로 받아주기 때문에 띄어쓰기가 포함된 문자열도 한번에 받을 수 있다.
getline(cin,a);
if( a == ".") break;
if(check(a)) cout << "yes\n";
else cout << "no\n";
}
}
답변 1
1
굉장히 좋은데요?
잘짜셨어요 ㅎㅎ 주석 좀 달았습니다.
#include<bits/stdc++.h>
using namespace std;
string a;
bool check(string s) {
//good
stack<char> cstk;
// good
for(char c : s ) {
if( c == '(' || c == '[') cstk.push(c);
// 현재 c가 ), ] 인데 stck이 비어있으면 return false;
if( (c == ')' || c == ']') && cstk.empty()) return false;
// 여기서 위의 조건의 else가 아닌 두가지 경우로 특정지었다.
if( c == ')'){
if(cstk.top() == '(') cstk.pop();
else return false;
}
if( c == ']') {
if(cstk.top() == '[') cstk.pop();
else return false;
}
}
//size보다 empty로 간단하게 == good
return cstk.empty();
}
int main () {
while(true) {
//good
getline(cin,a);
if( a == ".") break;
// 모듈화 good
if(check(a)) cout << "yes\n";
else cout << "no\n";
}
}
빠른 답변 감사합니다!