본문 바로가기
Algorithm/문제풀이

[프로그래머스] 괄호 변환(LV.2) by javascript - 2020 KAKAO BLIND RECRUITMENT

by 썸머워즈 2022. 3. 11.
반응형

▷ 문제 : 2020 KAKAO BLIND RECRUITMENT - 괄호 변환 LV.2

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

▷ 해결 날짜 : 2022.03.11
▷ 소요 시간 : 1시간 30분
▷ 풀이 과정 :
이번에는 좀 특이하게, 문제에서 로직을 전부 알려주고 우리는 그걸 구현하기만 하면 되는 문제였다.

 

재귀함수를 이용하면 풀 수 있는 문제이며, 재귀함수를 사용하라고 문제에서도 알려주고 있다.

이번 문제는 특이점은 없고 그냥 아래와 같은 로직을 그대로 구현할 수 있는 능력만 있으면 누구나 풀 수 있는 문제였다.

1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
 3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
 4-3. ')'를 다시 붙입니다.
 4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.


▷ 구현

function solution(p) {
    return getBalances(p).join('');
}

function getBalances(str){
    if(!str) return str;

    let balance = 0;
    let count = 0;

    do {balance += str[count++] === "(" ? 1 : -1} while (balance !== 0);
    
    let u = str.slice(0, count).split('');
    let v = str.slice(count).split('');

    if( /(?=^\()*(?=\)$)/g.test(u.join(''))){
        u.push(...getBalances(v.join('')));
    }else{
        u = [
            '('
            , ...getBalances(v.join(''))
            , ')'
            , ...u.slice(1, -1).map(e => (e == ")") ? "(" : ")")
        ];
    }
    
    return u;
}


▷ 복기 :
특이하고도 쉬운 문제였음에도 불구하고 1시간 30분이나 걸렸다.

우선 위 조건에서 "균형잡힌 괄호 문자열"을 체크하는 부분에서 어떻게 이걸 효율적으로 체크를 할까 고민을 많이 했다.

여기서 30분이나 소비되는 바람에 그냥 막 코딩으로 짜다가 위 코드는 최종적으로 리팩터링 해서 나온 결과다.

 

그냥 고민만 하다가 아무것도 못하니 뭐라도 끄적이면서 하는 게 나을 거 같다, 코드 개선이야 나중에도 할 수 있으니

(아 정규식에서도 and조건이 도대체 뭔지 몰라서 조금 헤매었다. )

 

다른 사람 풀이를 봤는데, 굳이 배열을 사용해서 하나로 모으는 작업을 할 필요 없이 문자열로만 가능하다는 걸 깨달았다.

뭐 그래도 나름 신선하고(?) 개성 넘치게 풀어서 만족한다.

반응형


댓글

TOP