カッコを回転[プログラマー]
📒コンセプトの使用
-stack後進先出とqueue後進先出を使用する問題解答
📌問題の説明
次の規則に従う文字列は、有効なカッコ文字列として定義されます.
📌インプリメンテーション
#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;
}
📌注意点
Reference
この問題について(カッコを回転[プログラマー]), 我々は、より多くの情報をここで見つけました https://velog.io/@gomhyeok/프로그래머스괄호-회전하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol