시도한 풀이
function solution(s) {
let answer = 0;
for (let i = 0; i < s.length; i++) {
const stack = [];
let _s = s.slice();
// _s는 x 개수만큼 index 접근한 다음 뒤에 push.
for (let j = 0; j < i; j++) {
_s += s[j];
}
for (let k = i; k < _s.length; k++) {
if (_s[k] === "(" || _s[k] === "[" || _s[k] === "{") {
stack.push(_s[k]);
}
else {
let value = stack.pop();
// 괄호 짝이 맞으면 아무것도 하지 않음
if (!((_s[k] === ")" && value === "(") ||
(_s[k] === "]" && value === "[") ||
(_s[k] === "}" && value === "{"))) {
stack.push(value); // 짝이 맞지 않으면 다시 스택에 넣기
}
}
}
if (stack.length === 0) answer++;
}
return answer;
}
[어려웠던 점]
괄호끼리 짝 맞춰야하니까 스택 써야하는 건 당연하고
`회전` 을 어떻게 시킬지가 포인트였는데
맨 앞에꺼를 뽑고 다시 붙이는 건 너무 시간도 공간도 오바라 어떻게 할까 고민하다가
x 만큼 뒤에다가 붙이고(이러면은 접근&push 둘 다 O(1))
괄호 읽어내는 걸 index를 그만큼 뒤로 밀면 되겠다 <- 아이디어가 떠올랐다.
마지막에 stack이 비어있으면 answer++
[새롭게 알게된 점]
책 코드가 훨씬 빠르다.
회전을 그냥 index 더한 다음에 길이로 나눠서 나머지로 처리한 게 킥인 거 같다.