728x90
반응형

2021.09.17

문제명 : 2020 KAKAO BLIND RECRUITMENT 괄호 변환

사용언어 : Javascript

개발 시간 : 120분

 

📋 문제 설명

  • 균형잡힌 괄호 문자열 = '(' 의 개수와 ')' 의 개수가 같은 경우     
  •   올바른  괄호 문자열 = '('와 ')'의 괄호의 짝도 모두 맞을 경우  

예 : (()))(  →  균형잡힌 괄호 문자열

예 : (())()  →  균형잡힌 괄호 문자열, 올바른 괄호 문자열

 

 

📢 입출력 예

새로운 예로 ' )()()()( ' 를 들어보겠습니다

 

주어진 단계를 순차적으로 따라가면 빨간색으로 표시한 부분을 모두 연결한 ' (((()))) ' 이 됩니다

 

 

 

 

🔑 문제 풀이

function solution(p) {
    var answer = '';
    
    answer = revision(p);
    
    return answer;
}

function revision(str){
    var res = '';
    var u = '';
    var v = '';
    var left = 0;
    var right = 0;
    var check = '';
    
    // 1.
    if(str == ""){
        return "";
    }else{
        // 2.
        for(var i=0; i<str.length; i++){
            if(str[i] == '('){
                left++;
            }else if(str[i] == ')'){
                right++;
            }
        
            if(left == right){
                u = str.substring(0,i+1);
                v = str.substring(i+1);
                break;
            }
        }
        
        // 3.
        check = right_check(u);
  
        if(check == 'T'){
            // 3-1.
            u += revision(v);
            
            return u;
        }else if(check == 'F'){  // 4.
            // 4-1.
            res += '(';
            // 4-2.
            res += revision(v);
            // 4-3.
            res += ')';
            // 4-4.
            u = u.substring(1,u.length-1);
            
            var r = '';
            for(var i=0;i<u.length;i++){
                if(u[i] == '('){
                    r += ')';
                }else{
                    r += '(';
                }
            }
            res += r;
            
            return res;
        }
    }
}


// 올바른 괄호 문자열인지 확인
function right_check(s){

    for(var j=0; j<s.length; j++){

        if(s == '()'){
            return 'T';
        }else{
        
            if(s[0] == ')'){
                return 'F';
            }else{
                if(s[j] == ')'){
                    s = s.substring(0,j-1) + s.substring(j+1);

                    if(s.length == 2){

                        if(s == ')('){    // 올바르지 않음
                            return 'F';
                        }else if(s == '()'){   // 올바름
                            return "T";
                        }
                    }else{
                        return right_check(s);
                    }
                }
            }
        }
    }
  
}

 

 

🔔 새로 알게 된 점

끝없는 재귀 함수의 연속이었다..

이미 1~4단계까지 주어진 로직이 있어서 따라가기만 하면 됐다

다음번엔 시간을 단축시켜서 풀 수 있도록 해야겠다

728x90
반응형

+ Recent posts