- stack과 queue를 활용하여 문제풀이
-stack의 후입 선출과 queue의 선입 선출을 활용한 문제풀이
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
#include <string>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
//queue에 담겨있는 괄호가 올바른 괄호 문자열인지 확인하는 함수
bool check (queue<char> q){
//stack의 후입선출을 통한 적절성 확인
stack<char> st;
st.push(q.front());
q.pop();
while(!q.empty()){
char ch = q.front();
q.pop();
//닫는 괄호가 나왔을 때 적절성 확인
if((ch==']'||ch=='}'||ch==')')&&!st.empty()){
char ch2 = st.top();
if(ch==']'){
if(ch2=='['){
st.pop();
}
else{
return false;
}
}
else if(ch=='}'){
if(ch2=='{'){
st.pop();
}
else{
return false;
}
}
else if(ch==')'){
if(ch2=='('){
st.pop();
}
else{
return false;
}
}
else{
return false;
}
}
//여는 괄호는 모두 stack에 삽입
else{
st.push(ch);
}
}
//마지막에 stack이 비어있지 않다면 올바른 괄호가 아님
if(!st.empty()){
return false;
}
return true;
}
int solution(string s) {
int answer = 0;
//queue의 선입선출을 활용해 가능 모든 괄호의 경우의 수를 만든다.
queue<char> bracket;
for(int i=0; i<s.size(); i++){
bracket.push(s[i]);
}
//가능한 괄호인 경우 answer+1
if(check(bracket)){
answer++;
}
//괄호를 하나씩 움직이며 가능한지 여부 판단.
for(int i=1; i<s.size(); i++){
char tmp = bracket.front();
bracket.pop();
bracket.push(tmp);
if(check(bracket)){
answer++;
}
}
return answer;
}