[프로그래머스 level2] 괄호 변환_2020 카카오

김예지·2021년 10월 24일
0

문제

https://programmers.co.kr/learn/courses/30/lessons/60058


문제 풀이

코드

function isRight(str) {
    const stack=[];
    for(let i=0; i<str.length; i++){
        if(str[i]==='(') stack.push(str[i]);
        else{
            if(stack.length===0) return false;
            else stack.pop();
        }
    }
    if(stack.length>0) return false;
    return true;
}

function solution(p) {
    if(p.length===0) return ''; //입력이 빈 문자열일 때 
    //올바른 괄호 문자열인지 판단 후, 올바르지 않으면(else) 변형해주기
    if(isRight(p)) return p;
    
    let start=0, end=0;
    let answer='';
    
    for(let i=0; i<p.length; i++){
        if(p[i]==='(') start++;
        else if(p[i]===')') end++;
        
        if(start===end) {
            //u가 올바른 괄호일 때 
            if(isRight(p.slice(0, i+1))){
                answer+=p.slice(0, i+1);
                answer+=solution(p.slice(i+1, p.length));
                return answer;
            }
            //u가 올바른 괄호가 아닐 때 
            else{
                answer+='(';
                answer+=solution(p.slice(i+1, p.length));
                answer+=')';
                for(let j=1; j<i; j++){
                    if(p[j]==='(') answer+=')';
                    if(p[j]===')') answer+='(';
                }
                return answer;
            }
        }
    }
}

문제에 나와있는 것과 같이, '재귀함수'를 잘 사용해야하는 문제다. 이런 문제는 아직 낯설어서, 풀다가 중간에 이분의 풀이를 보고 많은 힌트를 얻었다.
알고보니 재밌는 원리의 문제였다.
정답률은 23.1%이다. 문제푸는 방법은 문제에 다 설명되어있지만, 재귀가 어려워서 정답률이 낮은 것 같다.


참고 자료

profile
내가 짱이다 😎 매일 조금씩 성장하기🌱

0개의 댓글