C++/programmers 코딩테스트(level 2) C++

[C/C++] programmers Level 2 괄호 회전하기

CE : 하랑 2023. 10. 1. 18:53

 

 

 

 

 

코드

 

#include <string>
#include <stack> // 스택

using namespace std;

int solution(string s) {
    int answer = 0;
    string check=s+s; // 괄호는 한 번씩만 회전하기에 더함으로써 범위 별로 나눔 ex) [](){} + [](){}
    
    for(int i=0;i<s.size();i++){
        bool n=true; // 괄호 검사용 값
        stack<char> st; // 스택 이용
        
        for(int j=i;j<s.size()+i;j++){ // i 범위 별 만큼 이동
            if(check[j]=='[' || check[j]=='{' || check[j]=='('){ 
                st.push(check[j]);
            }else if(check[j]==']' || check[j]=='}' || check[j]==')'){ // 첫 스택 값이 ']', '}', ')' 들어갈 경우 괄호 검사 실패
                if(st.empty()){
                    n=false;
                    break;
                }
                
                switch(check[j]){ // 괄호 검사 통과 할 경우는 pop() 실행, 아닐 시는 같은 괄호 아님 
                        char temp;
                    case ']':
                        temp=st.top();
                        if(temp=='['){
                            st.pop();
                        }else{
                            n=false;
                        }
                        break;
                    case '}':
                        temp=st.top();
                        if(temp=='{'){
                            st.pop();
                        }else{
                            n=false;
                        }
                        break;
                    case ')':
                        temp=st.top();
                        if(temp=='('){
                            st.pop();
                        }else{
                            n=false;
                        }
                        break;        
                }
            }
        }
        
        if(!st.empty()){ // 스택이 비어있지 않으면 괄호 검사 실패
            n=false;
        }
        
        if(n){ // n 값이 true가 유지 될 경우 괄호 검사 성공으로 answer 값 증감
            answer++;
        }
    }
    
    return answer;
}