https://school.programmers.co.kr/learn/courses/30/lessons/76502
풀고 난 이후에 다른 분들의 풀이를 보니 대부분 스택을 사용하신 걸 알 수 있었다. 내 경우에는 스택을 직접 사용하진 않고 각 괄호별 int형 변수로 스택과 비슷하게 사용했다.
1) 먼저 각 괄호별로 int형 변수(bracket1
, bracket2
, bracket3
)를 마련해 스택을 표시해준다. 여는 괄호일 때 +1, / 닫는 괄호일 때 -1을 해주며, 여는 괄호가 나오기 이전에 닫는 괄호가 먼저 나오면 안 되기 때문에 음수가 되어서는 안 된다. 문자열 전체를 돌았을 때 모든 변수가 0이 되어야 올바른 문자열인 것이다.
2) (문자열 길이)횟수 만큼 문자열을 왼쪽으로 한 칸씩 회전하면서 올바른 문자열인지 확인한다.
3) 올바른 문자열인지 확인할 때는 CheckString
함수에 각 문자열을 인수로 넣어 확인한다.
[
, {
, (
)일 때[
인데 다음 괄호가 }
또는 )
일 때) ]
, }
, )
)일 때4) 회전시킨 모든 문자열을 CheckString
에 돌린 후 반환된 값을 count
변수에 누적시켜 이를 최종적으로 반환한다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int bracket1 = 0, bracket2 = 0, bracket3 = 0; // 각 괄호의 스택을 표시하는 정수. 음수로 떨어지면 안됨. 여는 괄호일 때 +1, 닫는 괄호일 때 -1,
// 문자열 전체 돌았을 때 최종적으로 모든 스택이 0이 되어야 함.
int CheckString(string s)
{
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '[')
{
bracket1 += 1;
// 현재 괄호가 여는 괄호인데 다른 종류의 괄호에 의해 바로 닫혀버리면 0 반환
if (i < s.size() - 1 && (s[i + 1] == '}' || s[i + 1] == ')'))
return 0; {(})
}
else if (s[i] == ']')
{
bracket1 -= 1;
}
else if (s[i] == '{')
{
bracket2 += 1;
if (i < s.size() - 1 && (s[i + 1] == ']' || s[i + 1] == ')'))
return 0;
}
else if (s[i] == '}')
{
bracket2 -= 1;
}
else if (s[i] == '(')
{
bracket3 += 1;
if (i < s.size() - 1 && (s[i + 1] == ']' || s[i + 1] == '}'))
return 0;
}
else if (s[i] == ')')
{
bracket3 -= 1;
}
// 각 괄호 스택 중 하나라도 음수가 되면 바로 0 반환
if (bracket1 < 0 || bracket2 < 0 || bracket3 < 0)
return 0;
}
// 마지막에 확인 했을 때 닫혀있지 않은 괄호가 있을 때는 0 반환 / 문제 없이 모든 문자열을 돌았다면 1 반환
if (bracket1 == 0 && bracket2 == 0 && bracket3 == 0)
return 1;
else
return 0;
}
int solution(string s) {
string str = s;
int count = 0;
int sLen = s.size();
for (int i = 0; i < sLen; i++)
{
count += CheckString(str);
str = str.substr(1, sLen - 1) + str.substr(0, 1); // 왼쪽으로 한 칸씩 회전
bracket1 = 0, bracket2 = 0, bracket3 = 0;
}
return count;
}