2020 KAKAO BLIND RECRUITMENT-괄호 변환

이서현·2021년 6월 9일
0

Algorithm

목록 보기
34/76

06.09에 푼 문제입니다🌷
변환 함수
재귀함수를 잘 이용해야 한다!
문제가 복잡해서 몇번 읽어보고 풀었다,,ㅎ

function solution(p) {
    return merge(p);
}

function merge(w){
    if(w==='') return ''
    let result=''
    let index = UV(w)
    let u=w.slice(0,index)
    let v=w.slice(index)
    if(checkbalance(u)){
        result+=u
        result+=merge(v)
    }
    else{
        result+='('+merge(v)+')'
        const ulist=[...u]
        ulist.pop()
        ulist.shift()
        ulist.forEach((x,index)=>{
            if(x==='(') ulist[index]=')'
            else ulist[index]='('
        })
        result+=ulist.join('')
        
    }
    
    return result
}

//u,v를 나누는 index를 구하는 함수
function UV(p){
    let num=0
    const plist=[...p]
    if(plist[0]==='(') num=1
    else if(plist[0]===')') num=-1
    
    for(let i=1;i<=plist.length;i++){
        if(num===0){
            num=i
            break
        }
        
        if(plist[i]==='(') num+=1
        else if(plist[i]===')') num-=1
        
    }
    return num
}
//균형잡힌 괄호 문자열인지 체크
function checkbalance(p){
    const plist=[...p]
    const stack=[]
    if(plist[0]===')') return false
    
    stack.push(plist.shift())
    for(let x of plist){
        if(stack.length===0) return false
        if(x==='(') stack.push(x)
        else if(x===')') stack.pop()
    }
    
    return true
}
profile
안녕하세요. 이서현입니다( ღ'ᴗ'ღ )

0개의 댓글