프로그래머스 - 괄호 회전하기
스택을 활용하면 금방 풀 수 있다.
0 ~ s.size()까지 shift를 하면서
[ { ( 를 만나면 스택에 푸쉬하고, ] } )를 만나면 조건에 맞춰서 스택의 탑을 빼준다.
만약 탑에서 빼주려할 때 스택이 비어있거나, 알맞는 짝이 아니라면 해당 shift는 올바르지 않은 괄호 문자열이라 break하고 넘어간다.
#include <string>
#include <vector>
#include <stack>
using namespace std;
int solution(string s) {
int answer = 0;
int size = s.size();
stack<char> st;
for(int shift=0; shift<size; shift++) {
bool isGood = true;
int end = shift + size;
for(int i=shift; i<end; i++) {
int idx = i % size;
if(s[idx] == '[' || s[idx] == '{' || s[idx] == '(')
st.push(s[idx]);
else {
if(st.empty()) {
isGood = false;
break;
}
if(s[idx] == ']') {
if(st.top() == '[')
st.pop();
} else if(s[idx] == '}') {
if(st.top() == '{')
st.pop();
} else if(s[idx] == ')') {
if(st.top() == '(')
st.pop();
} else {
isGood = false;
break;
}
}
}
if(isGood && st.empty())
answer++;
}
return answer;
}