[c++/알고리즘] 프로그래머스 괄호회전하기

corncheese·2021년 8월 18일
0

알고리즘문제풀이

목록 보기
30/31

괄호문제는.. stack으로 푼다. / 문제조건을 더욱 꼼꼼하게 보기
이 문제같은 경우는 [(]) 이런 괄호는 올바른 괄호가 아니였다.

#include <string>
#include <vector>
#include <stack>

using namespace std;

int solution(string s) {
    int answer = 0;
    
	// 문자열의 길이만큼 괄호를 회전
    for(int j=0; j<s.length(); j++){
        stack<char> st;
        int chk = 0;

        for(int i=0; i<s.length(); i++){

            if(s[i] == '(' || s[i] == '{' || s[i] == '[' ){
                st.push(s[i]);
            }
            // 스택이 비어있을때 닫는 괄호이면 잘못된 괄호이므로 체크 후 브레이크.
            else if( (s[i] == ')' || s[i] == '}' || s[i] == ']') && st.empty()){
                chk = 1;
                break;
            }
            else if(s[i] == ')' && st.top()=='('){
                st.pop();
            }
            else if(s[i] == '}' && st.top()=='{'){
                st.pop();
            }
            else if(s[i] == ']' && st.top()=='['){
                st.pop();
            }

        }
		
        // 문자열이 비어있고, 스택이 비어있을때 닫는괄호가 입력된 경우가 아닌 경우 올바른 괄호이다.
        if(st.empty() && chk == 0){ answer++; }

	// 괄호 회전
     	// 맨 앞 문자열을 append 시킨다.
        // 맨 앞 문자열을 지운다.
        s += s[0];
        s.erase(0,1);
    }
    return answer;
}

정확성 92.9 // 스택으로 풀 문제가 아니라고 생각해서 다르게 풀었는데.. 스택으로 다시 풀어보기..

#include <string>
#include <vector>
#include <list>

using namespace std;

int solution(string s) {
    int answer = 0;
    char p;
    list<char> q;
    
    for(int i=0; i<s.length(); i++){
        q.push_back(s[i]);
    }
    
    for(int j=0; j<s.length(); j++){
        bool ch = 0;
        int a=0, b=0, c=0;
        for(auto f : q){
            
            if(f == '('){a += 1; ch = 1;}
            else if(f == '['){b += 1; ch =1;}
            else if(f == '{') {c += 1; ch=1;}
            // 맞지않는 경우
            else if(f == ')' && a > 0){a--;}
            else if(f == ']' && b > 0){b--;}
            else if(f == '}' && c > 0){c--;}
            
        }
            
        if(ch==1 && a == 0 && b == 0 && c==0){answer++;}
        
        p = q.front();
        q.pop_front();
        q.push_back(p);
    }
    
    return answer;
}

0개의 댓글