프로그래머스 - 괄호 회전하기 (Lv.2)

1 minute read

문제 링크

문제 접근

  • 문자열에서 괄호가 올바르게 열고 닫혀야만 올바른 괄호 문자열이다.
  • 즉, ‘(‘, ‘{‘, ‘[’ 괄호가 나왔다면 반드시 대응하는 반대 괄호로 닫혀야만 한다.
  • 스택 자료구조를 이용하여 왼쪽 괄호는 스택에 담고, 오른쪽 괄호가 나오면 top() 원소와 대응되는지를 확인하고, 대응되면 pop() 연산을 진행한다.
  • 스택이 비어있거나, 대응되는 괄호가 없다면 올바른 괄호 문자열이 아니다.
  • 탐색이 완료되었을 때 모든 괄호가 스택에서 제거되었다면 올바른 괄호 문자열이다.
  • 괄호 문자열 회전을 위해 string 인스턴스 중 substr(start_idx, count) 함수를 사용하였다. 해당 함수는 start_idx 부터 count 만큼 부분문자열을 반환하는 함수이고, count를 생략하거나 문자열 길이보다 큰 숫자를 전달하는 경우 문자열의 끝까지만 부분문자열을 반환한다.

구현(All Pass)

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

using namespace std;

int check_correct_string(string str){
    stack<char> s;

    for(int i=0; i<str.length(); i++){
        if(str[i]=='(' || str[i]=='{' || str[i]=='[')
            s.push(str[i]);
        else if(str[i]==')'){
            if(s.empty()) return 0;
            else if(s.top()=='(') s.pop();
            else return 0;
        }
        else if(str[i]=='}'){
            if(s.empty()) return 0;
            else if(s.top()=='{') s.pop();
            else return 0;
        }
        else if(str[i]==']'){
            if(s.empty()) return 0;
            else if(s.top()=='[') s.pop();
            else return 0;
        }
    }

    if(s.empty()) return 1;
    else return 0;
}

int solution(string s) {
    int answer = 0;

    string str = s;
    answer += check_correct_string(str);
    for(int i=1; i<s.length(); i++){
        char first_ch = s[0];
        str = s.substr(1);
        str.push_back(first_ch);
        answer += check_correct_string(str);
        s = str;
    }

    return answer;
}

  • switch 문으로 같은 로직을 짰는데, swtich 문으로 들어가지를 못했다. 이유를 모르겠음…

Leave a comment