문제 설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- s의 길이는 1 이상 1,000 이하입니다.
구현해야할 조건
전형적인 스택문제이다. 똑바른 괄호 올바른 괄호 등등등! 그런데 이번엔 괄호를 한칸씩 이동시키는데 deque를 사용해도 되고 string을 사용해도 무관하다. 문제에서는 string이 나와있기 때문에 string을 사용하고, stack안에 아무것도 없을때 비로소 올바른 수열로 체크가 된다!
code
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;
int solution(string s)
{
int answer = 0;
int size = s.length();
for(int i = 0 ; i < size; i++)
{
stack<char> st;
bool flag = false;
for(int i = 0; i < s.length(); i++)
{
if(s[i] == '{' || s[i] == '(' || s[i] == '[')
{
flag = true;
st.push(s[i]);
}
else
{
if (s[i] == ']' && st.top() == '[')
st.pop();
if (s[i] == '}' && st.top() == '{')
st.pop();
if (s[i] == ')' && st.top() == '(')
st.pop();
}
}
if(st.empty() && flag)
answer += 1;
char ch = s.front();
s.erase(s.begin());
s.push_back(ch);
}
return answer;
}
'PS > Programmers' 카테고리의 다른 글
[Lv.2] 배달 (0) | 2022.03.10 |
---|---|
[Lv.2] 순위 검색 (0) | 2022.03.10 |
[Lv.2] 소수 찾기 (0) | 2022.03.10 |
[Lv.2] 가장 큰 수 (0) | 2022.03.09 |
[Lv.2] 수식 최대화 (0) | 2022.03.09 |