ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스/javascript] 괄호변환
    카테고리 없음 2023. 3. 29. 18:08

    풀이방법

    우선 균형잡힌 문자열이맞는지 확인하는 코드와 올바른 문자열이 맞는지 확인하는 펑션을 작성하였습니다.

    이후 올바른 문자열이 맞다면 그대로 p를 반환하고

    아닐경우 u와 v로 나뉘게 됩니다.

    새로운 u(newP)가 올바른 문자열이 맞다면 u+solution(v)를 반환합니다.

    그렇지 않다면, 문제에 적힌대로 뒤집고 어쩌구저쩌구를 실행합니다. 🤣

     

     

    //균형잡힌 문자열...이라하면...
    //p가 군형잡힌 문자열이라면 그대로 반환한다.
    //그렇지 않으면 균형잡힌문자열로 더이상 분리할수없는 u와 v나머지로 분류한다.
    //즉 return solution(u)+solution(v)...??
    //즉 앞에서부터 잘라서, isBalanced===true인 경우를 찾음. 근데 이제 두개씩 증가해가면서 찾으면 됨.
    //얘가 올바른 문자열이라면 얘는 그대로 반환하고 v에 대해서 또 분리해서 수행하면 됨.
    //즉 가운데 쯤에 있는 제일 문제인 놈 찾으면 됨.!!
    // 올바른 문자열이 아니라면 v에 대해서 재귀적으로 수행해서 반환값을 찾음.!! 
    // (여기에 v반환값넣음) + u는 앞뒤 문자 제거하고, 괄호 방향디집어줌. 그리고 ()로 감싸줌..!!
    
    function solution(p,v=null) {
        if(isCorrect(p)) return p
        let newP
        for(let i=1;i<p.length;i+=2){
            newP= p.slice(0,i+1)
            if(isBalanced(newP)) {
                v=p.slice(i+1)
                break;
            }
        }
        if(isCorrect(newP)) return newP+solution(v)
        else{
            newP = newP.slice(1,newP.length-1)
            let newU = ''
            for(let i=0;i<newP.length;i++){
                if(newP[i]==='(') newU+=')'
                else newU+='('
            }
            return `(${solution(v)})${newU}`
        }
    }
    
    function isCorrect(str){
        let stack = [];
        for(let i=0;i<str.length;i++){
            if(str[i]==='('){
                stack.push('(')
            }else{
                if(stack[stack.length-1]==='('){
                stack.pop()
                }
                else return false;
            }
        }
        return true;
    }
    
    function isBalanced(str){
        let obj = {'(':0,')':0}
        for(let i=0;i<str.length;i++){
            if(str[i]==='('){
                obj['(']++;
            }else{
                obj[')']++;
            }
        }
        return obj['(']===obj[')']?true:false
    }
Designed by Tistory.