본문 바로가기

Algorithm/Programmers

[Programmers] 괄호 회전하기

안녕하세요. 이번 포스팅에서는 괄호 회전하기 문제를 풀어보도록 하겠습니다.

 

해당 문제는

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

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr

 

위 링크를 통해 확인하실 수 있습니다.

 

c++에 rotate라는 유용한 함수가 있습니다.

배열의 값을 하나씩 뒤로 미룰 수 있는 기능을 제공합니다.

 

이 rotate함수를 사용하여, 배열의 첫 원소를 맨 뒤로 미뤄가면서 현재 문자열이 올바른 괄호 열인지 아닌지 판단해주었습니다.

 

올바른 괄호열 판단에는 stack 자료구조를 사용하였습니다.

 

1. '(', '{', '['의 문자열이면, stack에 push를 합니다.

2. ')', '}', ']'이면

 2.1) stack이 비어있으면 false를 리턴합니다.

 2.2) stack이 비어있지 않다면 top과 매칭 되는지 확인합니다. 매칭 된다면 pop을 진행합니다.

3. 반복

 

<소스 코드>

#include <bits/stdc++.h>

using namespace std;

bool check(string s) {
    stack<char> stk;
    for(int i = 0; i < s.size(); i++) {
        if(s[i] == '(' || s[i] == '{' || s[i] == '[') stk.push(s[i]);
        else {
            if(stk.size() == 0) return false;
            if(s[i] == ')' && stk.top() == '(') stk.pop();
            else if(s[i] == '}' && stk.top() == '{') stk.pop();
            else if(s[i] == ']' && stk.top() == '[') stk.pop();
        }
    }
    
    if(stk.size()) return false;
    return true;
}
int solution(string s) {
    int answer = 0;
    for(int x = 0; x < s.size(); x++) {
        rotate(s.begin(), s.begin()+1, s.end());
        if(check(s)) answer++;
    }
    return answer;
}

 

*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.