[Programmers] Level2 : 괄호 회전하기
Question
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;
}