ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 괄호 회전하기
    프로그래머스(Programmers) 2022. 5. 18. 23:50
    반응형

    문제 설명

    제한사항

    • s의 길이는 1 이상 1,000 이하입니다.

    입출력 예

    sresult

    "[](){}" 3
    "}]()[{" 2
    "[)(]" 0
    "}}}" 0

    입출력 예 설명

    입출력 예 #1

    • 다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.

    xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?

    0 "[](){}" O
    1 "](){}[" X
    2 "(){}[]" O
    3 "){}[](" X
    4 "{}[]()" O
    5 "}[](){" X
    • 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

    입출력 예 #2

    • 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.

    xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?

    0 "}]()[{" X
    1 "]()[{}" X
    2 "()[{}]" O
    3 ")[{}](" X
    4 "[{}]()" O
    5 "{}]()[" X
    • 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.

    입출력 예 #3

    • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

    입출력 예 #4

    • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

     

     

    => 괄호문제의 경우 stack을 이용하는 경우가 대다수입니다. 

    =>해당 문제 역시 여는 괄호일 경우 stack에 push하고 닫는 괄호일 경우 stack에서 pop을 하면 되는 문제입니다.

    => 다만 stack에 맨위에 위치한 괄호와 현재 닫는 괄호가 짝이 맞을 경우에만 pop 을 할 수 있습니다. 

    => 문자열을 탐색하며 모든 작업을 끝마친 후, stack에 값이 남아지 않아야 '올바른 문자열'입니다. (stack에 값을 넣은 이력이 있는 경우 필수)

     

     

    #include <iostream>
    #include <string>
    #include <vector>
    #include <stack>
    using namespace std;
    
    int solution(string s) {
        int answer = 0;
        int rep = s.length();
        
        
        while(rep>0)
        {
            stack<char>st;
            bool flag = false; 
            for(int i=0; i<s.length(); i++)
            {
                if(s[i]=='(' ||s[i]=='[' ||s[i]=='{')//stack에 쌓는 경우 
                {
                    flag = true;
                    st.push(s[i]);
                }
                
                else//올바른 괄호이기에 뺄 수 있는 경우
                {
                    if(s[i]==')' && st.top() == '(') // 소괄호
                    {
                        st.pop();
                    }
                    if(s[i]==']' && st.top() == '[') // 중괄호
                    {
                        st.pop();
                    }
                    if(s[i]=='}' && st.top() == '{') // 대괄호
                    {
                        st.pop();
                    }
                }
                
            }
            
            char ch = s.front();
            s.erase(s.begin());
            s.push_back(ch);
           
            if(flag && st.empty()) answer++;
            
            rep--;
            
        }
    
        return answer;
    }
    반응형

    댓글

Designed by Who.