순차적으로 회전을 하면서 각각의 글자를 체크한다.
닫힌 괄호가 먼저 나왔는지, 짝이 맞는지,괄호가 닫힐 때 마지막으로 나온 열린 괄호가 닫힌건지 에 대해서만 체크하면 통과가 된다.
function solution(s) {
const obj = {
"[":1,
"]":-1,
"{": 1,
"}": -1,
"(":1,
")":-1
}
const sizeObj = {
"[":"checkL",
"]":"checkL",
"{":"checkM",
"}":"checkM",
"(":"checkS",
")":"checkS"
}
const stepObj = {
"}":"{",
"]":"[",
")":"("
}
const check = (string)=>{
let value = true
let checkObj = {
checkS:0,
checkM:0,
checkL:0
}
let stepArr= []
const split = string.split("")
for(let i =0;i<split.length;i++){
// 닫는 괄호로 먼저 시작하면 false return
const item = split[i]
const itemValue = obj[item]
checkObj[sizeObj[split[i]]] +=itemValue
if(Object.keys(checkObj).filter(j=>checkObj[j]<0).length){
value = false
break
}
if(itemValue>0){
stepArr.push(item)
}
if(itemValue<0){
if(stepArr[stepArr.length-1]!==stepObj[item]){
value = false
break
}else{
stepArr= stepArr.slice(0,-1)
}
}
}
// 다른 괄호가 닫히기 전에 괄호를 닫아버리면 false
// 닫히는 순간에, 닫히는 괄호가 가장 마지막에 오픈한 괄호인지, 가장 마지막 괄호가 아니라면 false
return Object.keys(checkObj).every(i=>checkObj[i]===0)?value:false
}
var answer = 0
for(let i=0;i<s.length;i++){
const rotateS = s.substr(i) + s.substr(0,i)
if(check(rotateS)){
answer +=1
}
}
return answer;
}