カッコを回転[プログラマー]


📒コンセプトの使用

  • スタックとキューを使用して解答
    -stack後進先出とqueue後進先出を使用する問題解答
  • 📌問題の説明


    次の規則に従う文字列は、有効なカッコ文字列として定義されます.
  • ()、[]および{}は有効なカッコ文字列です.
  • Aが有効な括弧文字列である場合、(A)、[A]および{A}も有効な括弧文字列である.たとえば、[]は有効な括弧文字列であり、([])も有効な括弧文字列である.
  • A、Bが有効な括弧文字列であれば、ABも有効な括弧文字列である.たとえば、{}および([])は有効なカッコ文字列であり、{}([])も有効なカッコ文字列です.
  • パラメトリック文字列sは、四角カッコ、大かっこ、小かっこからなる.sをx(0≦x<(sの長さ)格子に左に回転すると、solution関数を完了し、sを正しいカッコ文字列にするxの個数を返します.

    📌インプリメンテーション

    #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;
    }

    📌注意点

  • 最初は、すべてのカッコの数を決定する方法を考えていました.ただし,queueの先入先出の特徴を用いると,先に前の括弧を外してから後ろに置くことができる.
  • カッコが正しいかどうかを判断するのは簡単です.スタックを使用して何度もやったことがあるからです.