괄호문제는.. stack으로 푼다. / 문제조건을 더욱 꼼꼼하게 보기
이 문제같은 경우는 [(]) 이런 괄호는 올바른 괄호가 아니였다.
#include <string>
#include <vector>
#include <stack>
using namespace std;
int solution(string s) {
int answer = 0;
// 문자열의 길이만큼 괄호를 회전
for(int j=0; j<s.length(); j++){
stack<char> st;
int chk = 0;
for(int i=0; i<s.length(); i++){
if(s[i] == '(' || s[i] == '{' || s[i] == '[' ){
st.push(s[i]);
}
// 스택이 비어있을때 닫는 괄호이면 잘못된 괄호이므로 체크 후 브레이크.
else if( (s[i] == ')' || s[i] == '}' || s[i] == ']') && st.empty()){
chk = 1;
break;
}
else if(s[i] == ')' && st.top()=='('){
st.pop();
}
else if(s[i] == '}' && st.top()=='{'){
st.pop();
}
else if(s[i] == ']' && st.top()=='['){
st.pop();
}
}
// 문자열이 비어있고, 스택이 비어있을때 닫는괄호가 입력된 경우가 아닌 경우 올바른 괄호이다.
if(st.empty() && chk == 0){ answer++; }
// 괄호 회전
// 맨 앞 문자열을 append 시킨다.
// 맨 앞 문자열을 지운다.
s += s[0];
s.erase(0,1);
}
return answer;
}
정확성 92.9 // 스택으로 풀 문제가 아니라고 생각해서 다르게 풀었는데.. 스택으로 다시 풀어보기..
#include <string>
#include <vector>
#include <list>
using namespace std;
int solution(string s) {
int answer = 0;
char p;
list<char> q;
for(int i=0; i<s.length(); i++){
q.push_back(s[i]);
}
for(int j=0; j<s.length(); j++){
bool ch = 0;
int a=0, b=0, c=0;
for(auto f : q){
if(f == '('){a += 1; ch = 1;}
else if(f == '['){b += 1; ch =1;}
else if(f == '{') {c += 1; ch=1;}
// 맞지않는 경우
else if(f == ')' && a > 0){a--;}
else if(f == ']' && b > 0){b--;}
else if(f == '}' && c > 0){c--;}
}
if(ch==1 && a == 0 && b == 0 && c==0){answer++;}
p = q.front();
q.pop_front();
q.push_back(p);
}
return answer;
}