본문 바로가기

코딩테스트/프로그래머스

[프로그래머스] 괄호 회전하기

728x90
반응형


🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/76502

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


👩‍💻 코드

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

using namespace std;

bool isValid(string s) {
    stack<char> st;
    unordered_map<char, char> matching_bracket = {{')', '('}, {']', '['}, {'}', '{'}};

    for (auto c : s) {
        switch (c) {
            case '(':
            case '[':
            case '{':
                st.push(c);
                break;
            case ')':
            case ']':
            case '}':
                if (!st.empty() && st.top() == matching_bracket[c]) {
                    st.pop();
                } else {
                    return false;
                }
                break;
            default:
                break;
        }
    }

    return st.empty();
}

int solution(string s) {
    int answer = 0;
    int n = s.size();
    s += s;
    
    for(int i=0; i<n; i++){
        string shiftedStr;
        for(int j=i; j<i+n; j++){
            shiftedStr += s[j];
        }
        
        if(isValid(shiftedStr)){
            answer++;
        }
    }
    
    return answer;
}

📝 풀이

올바른 괄호 문자열을 판단하는 isValid 함수를 구현했다.

왼쪽 괄호인 경우에는 stack에 push한다.

오른쪽 괄호인 경우에는 짝이 맞는 괄호가 stack의 top인지 비교 후 맞다면 pop하고 다르다면 false를 return한다.

문자열을 끝까지 확인 후 stack에 괄호가 남아 있다면 짝이 맞지 않으니 st.empty()를 return한다.

 

회전하는 문자열을 비교할수 있도록 s문자열에 s문자열을 추가했다.

회전하는 문자열은 0부터 n, 1부터 n+1, 2부터 n+2... 방식으로 shiftedStr에 저장했다.

최종 shiftedStr에 아까 구현한 isValid 함수 매개 변수로 실행시켜 true인 경우에만 answer를 증가시킨다.

모든 코드를 실행시키고 answer을 return 한다.

728x90
반응형