카테고리 없음

[프로그래머스/javascript] 괄호변환

_서리__ 2023. 3. 29. 18:08

풀이방법

우선 균형잡힌 문자열이맞는지 확인하는 코드와 올바른 문자열이 맞는지 확인하는 펑션을 작성하였습니다.

이후 올바른 문자열이 맞다면 그대로 p를 반환하고

아닐경우 u와 v로 나뉘게 됩니다.

새로운 u(newP)가 올바른 문자열이 맞다면 u+solution(v)를 반환합니다.

그렇지 않다면, 문제에 적힌대로 뒤집고 어쩌구저쩌구를 실행합니다. 🤣

 

 

//균형잡힌 문자열...이라하면...
//p가 군형잡힌 문자열이라면 그대로 반환한다.
//그렇지 않으면 균형잡힌문자열로 더이상 분리할수없는 u와 v나머지로 분류한다.
//즉 return solution(u)+solution(v)...??
//즉 앞에서부터 잘라서, isBalanced===true인 경우를 찾음. 근데 이제 두개씩 증가해가면서 찾으면 됨.
//얘가 올바른 문자열이라면 얘는 그대로 반환하고 v에 대해서 또 분리해서 수행하면 됨.
//즉 가운데 쯤에 있는 제일 문제인 놈 찾으면 됨.!!
// 올바른 문자열이 아니라면 v에 대해서 재귀적으로 수행해서 반환값을 찾음.!! 
// (여기에 v반환값넣음) + u는 앞뒤 문자 제거하고, 괄호 방향디집어줌. 그리고 ()로 감싸줌..!!

function solution(p,v=null) {
    if(isCorrect(p)) return p
    let newP
    for(let i=1;i<p.length;i+=2){
        newP= p.slice(0,i+1)
        if(isBalanced(newP)) {
            v=p.slice(i+1)
            break;
        }
    }
    if(isCorrect(newP)) return newP+solution(v)
    else{
        newP = newP.slice(1,newP.length-1)
        let newU = ''
        for(let i=0;i<newP.length;i++){
            if(newP[i]==='(') newU+=')'
            else newU+='('
        }
        return `(${solution(v)})${newU}`
    }
}

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

function isBalanced(str){
    let obj = {'(':0,')':0}
    for(let i=0;i<str.length;i++){
        if(str[i]==='('){
            obj['(']++;
        }else{
            obj[')']++;
        }
    }
    return obj['(']===obj[')']?true:false
}