괄호 회전하기

강인호·2024년 5월 8일
0

알고리즘 문제풀이

목록 보기
37/39

순차적으로 회전을 하면서 각각의 글자를 체크한다.
닫힌 괄호가 먼저 나왔는지, 짝이 맞는지,괄호가 닫힐 때 마지막으로 나온 열린 괄호가 닫힌건지 에 대해서만 체크하면 통과가 된다.

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;
}

0개의 댓글