프로그래머스(Programmers)

괄호 회전하기

cosmohoo 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;
}
반응형