[프로그래머스] Lv2. 괄호 변환- JavaScript

이상돈·2023년 4월 5일
0
post-thumbnail

문제분류 : 코팅테스트 연습

난이도 : Level 2

출처 : 프로그래머스 - 괄호 변환

문제

  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. 생성된 문자열을 반환합니다.

제한사항

📌 내가 생각한 풀이

문제를 나누어서 생각하자
  1. 입력이 빈 문자열의 경우 빈 문자열을 반환
  2. 두 균형잡힌 문자열을 u,v로 나누기 함수
  3. 올바른 괄호 문자열인지 아닌지 확인 함수
  4. 전체 프로세스를 진행할 whole 함수
이렇게 4가지 과정을 만들어서 쓰여진대로 풀자.
// u,v를 나누는 seperate함수
const seperate = (str) =>{
    let num1 = 0;
    let num2 = 0;
    let slice = 0;
    let u = "";
    let v = "";
    for(var i =0; i<str.length; i++){
        if(str[i] === '(') num1++
        else num2++
        if(num1 === num2){
            slice= i;
            break;
        }
    }
    u = str.substring(0,slice+1);
    v = str.substring(slice+1);
    return [u,v];
}
//올바른 괄호 문자열인지 체크하는 함수.
const isAll = (str) =>{
    let stack = [];
    for(var i =0; i<str.length; i++){
        if(str[i] === '('){
            stack.push(str[i]);
        }else{
            stack.pop();
        }
    }
    if(stack.length ===0 ) return true;
    else return false;
}

const whole = (str) =>{
    //입력이 빈 문자열인 경우, 빈 문자열을 반환.
    if(str.length == 0){
        return "";
    }else{
        
        let [u,v] = seperate(str);
        if(isAll(u)){
            let newStr = whole(v);
            return u + newStr
        }else{
            let newStr ='(';
            let str2 = "";
            let k = u.substring(1,u.length-1);
            let a = whole(v);
            //4-1 ~ 4-5작업 수행과정
            for(var i =0; i<k.length; i++){
                if(k[i] === '('){
                    str2 +=')'
                }else{
                    str2 +='('
                }
            }
            return newStr + a + ')' + str2;
        }
    }
}

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

📌 느낀점

처음에는 되게 어렵다고 생각한 문제이다. 하지만, 문제를 따라읽고, 천천히 문제의 주어진 조건으로만 푸니까, 쉽게 해결되었다. 재귀함수 부분을 많이 공부하여서 약간 한번에 풀렸던 문제인 것 같다.

profile
사람들의 더 나은 삶을 위한 개발자

0개의 댓글