import java.util.Arrays;
import java.util.Stack;
class Solution {
public int solution(String s) {
// 1. 올바른 괄호 형태인지 확인
// 2. 문자열 회전후 반복
// 여는 괄호 나오면 stack에 넣기, 닫는 괄호 나오면 마지막 것이 같은쌍인지 확인
int count = 0;
for (int i = 0; i < s.length()-1; i++) {
// 올바른 괄호 형태인지 확인
if (checkCorrect(s)) {
count++;
}
// 회전 시킨 s로 갱신
s = circleLeftString(s);
}
return count;
}
private String circleLeftString(String s) {
char[] sToCharArr = s.toCharArray();
String transStr = String.valueOf(Arrays.copyOfRange(sToCharArr, 1, sToCharArr.length)) + sToCharArr[0];
return transStr;
}
private boolean checkCorrect(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char target = s.charAt(i);
if (target == '(' || target == '{' || target == '[') {
stack.push(target);
} else {
// 닫는 괄호인데 스택에 현재 아무것도 없다
if (stack.isEmpty()) {
return false;
}
char inStackChar = stack.peek();
switch (target) {
case ')' -> {
if (inStackChar != '(') {
return false;
}
stack.pop();
}
case '}' -> {
if (inStackChar != '{') {
return false;
}
stack.pop();
}
default -> {
if (inStackChar != '[') {
return false;
}
stack.pop();
}
}
}
}
// 모두 여는 괄호만 있을 경우 else 문이 실행이 안되니 pop이 안됨
// 따라서 size를 실제로 검사 해줘야 함
if(stack.size() !=0) {
return false;
}
return true;
}
}
전체 과정
괄호를 쓴다고 하면 동일한 괄호가 열렸으면, 동일한 괄호로 닫혀야 한다.
(가 나오면 )가 나와야 함({[]}) 이런식으로 봐도 동일한 괄호로 닫혀야 함여는 괄호가 나오면 stack에 넣고, 빼는거 나오면 같은종류인지 확인하고 뺌
이 과정을 n-1번 반복
하지만 닫는 괄호 종류까지만 보는 것이 아닌 마지막에 stack의 size도 검사해야 함
((( 처럼 여는 괄호만 나올 경우 else문에 걸려 pop되는 경우가 없이 true로 반환됨