Programmers - 괄호변환

Doodream·2021년 3월 31일
0

코딩테스트

목록 보기
13/22
post-thumbnail

💻 괄호변환


❓ 문제

https://programmers.co.kr/learn/courses/30/lessons/60058?language=javascript

✔️ 코드

function solution(p) {
    var answer = "";
    if (p.length === 0) return p;
    p = p.split('');
    var u = "";
    var v = "";

    var openCount = 0;
    var closeCount = 0;

    while (true) {
        var tmp = p.shift();

        if (tmp === "(") {
            openCount++;
            u += tmp;
        } else {
            closeCount++;
            u += tmp;
        }
        if (openCount === closeCount) break;
        //console.log(1);
    }
    v = p.join('');

    if (isCorrectString(u)) answer = solution(v);
    else {
        answer += "(";
        answer += solution(v);
        answer += ")";
        u = u.split('');
        u.shift();
        u.pop();
        var tmp = "";
        for (var i = 0; i < u.length; i++) {
            u[i] === "(" ? tmp += ")" : tmp += "(";
        }
        answer += tmp;
        //console.log(2);

        return answer;
    }
    //console.log(3);
    return u + answer;
}

// s는 균형 잡힌 문자열
function isCorrectString(s) {
    var answer = true;
    // 문자열에서 괄호가 닫힌 경우를 모두 제거하고 (반복)제거 후 문자열로 통합
    var sStr = s.split('()').join('');
    // 해당 문자열이 () 혹은 없는 경우 true
    if (sStr === '()' || sStr === '') {
        return answer;
    }

    // false 인 경우는 '()))((()' 이런 경우 이므로 바로 위코드를 수행하면 ')))(((' 이렇게 되어 거른다. 
    if (sStr[0] !== '(' || sStr[sStr.length - 1] !== ')') {
        answer = false;
        return answer;
    }
    return answer;
}

❗️풀이과정

문제를 순서대로 따라가되, solution을 재귀함수로 구성해야해서 재귀적 return의 순서를 판단해서 넣어야 한다.

먼저 균형잡힌문자열로 u와 v를 갈라놓기 위해서 p의 가장 앞자리 부터 빼내서 가장 작은 균형잡힌 문자열이 되면 u와 v로 갈라 놓는다.

만약 u가 올바른문자열인지 확인이 되었다면 ... 문제를 따라간다.
다만 여기서 올바른 문자열인지 확인 하는 방법은

function isCorrectString(s) {
    var answer = true;
    // 문자열에서 괄호가 닫힌 경우를 모두 제거하고 (반복)제거 후 문자열로 통합
    var sStr = s.split('()').join('');
    // 해당 문자열이 () 혹은 없는 경우 true
    if (sStr === '()' || sStr === '') {
        return answer;
    }

    // false 인 경우는 '()))((()' 이런 경우 이므로 바로 위코드를 수행하면 ')))(((' 이렇게 되어 거른다. 
    if (sStr[0] !== '(' || sStr[sStr.length - 1] !== ')') {
        answer = false;
        return answer;
    }
    return answer;
}

위 코드를 참고하면 된다.

마지막에 solution 함수가 반환하는 것에서 answer를 반환하는데, 이경우 문제를 읽어보면 항상 맨마지막에는 u에 answer을 이어 붙인다.
즉, 문제의 3번을 읽어보고 재귀적으로 실행 순서를 이해해야 코드순서를 짤수 있다.

배운점

  • 재귀함수의 반환시점을 고를 때는 신중하게 코드의 순서를 확인하자.
profile
일상을 기록하는 삶을 사는 개발자 ✒️ #front_end 💻

0개의 댓글