1 분 소요

Question

Q Q2


Solution

  • s.size 만큼 회전 시킨다. (실제로는 size -1 만큼 회전해도 되지만 그러면 코드를 추가해야 됨)
  • 열린 괄호는 stack에 담는다. 그리고 마지막에 들어온 괄호에 대해 맞는 짝 닫힌 괄호를 찾는다.
  • 짝이 아니면 break하여 다음 회전된 s에 대해 다시 확인한다.
  • stack이 비어있을때 닫힌 괄호가 들어오면 break 한다. (push도 해줘야 empty 체크 할때 answer를 증가시켜 주지 않는다.)

Cord

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

using namespace std;

int solution(string s) 
{
    int answer = 0;
    
    // 회전 수
    for (int i = 0; i < s.size(); ++i)
    {
        stack<char> parentheses;
        
        // s에대한 문자 루프
        for (int j = 0; j < s.size(); ++j)
        {
            // 열린 괄호는 stack에 push
            if (s[j] == '(' || s[j] == '{' || s[j] == '[') { parentheses.push(s[j]); }
            else  // 닫힌 괄호가 들어온다면
            {
                // 빈 공간에 닫히 괄호가 들어오면 종료
                if (parentheses.empty()) { parentheses.push(s[j]); break; }
                else
                {
                    // 맞는 짝이 오면 pop
                    if (parentheses.top() == '(' && s[j] == ')') { parentheses.pop(); }
                    else if (parentheses.top() == '{' && s[j] == '}') { parentheses.pop(); }
                    else if (parentheses.top() == '[' && s[j] == ']') { parentheses.pop(); }
                    // 짝이 맞지 않으면 종료
                    else { break; }
                }
            }
        } 
        
        if (parentheses.empty()) { ++answer; }
        
        // 회전 - 가장 앞의 문자를 맨 뒤로 보내기
        char frist = s.front();
        s.erase(s.begin());
        s += frist;
    }
    return answer;
}

Result

Result