코딩테스트

[프로그래머스/javascript] 3차 압축

_서리__ 2023. 2. 28. 22:58
function solution(msg) {
    //LZW압축
    //일단 해보고 재귀로 푸는 법 있나 생각해보기
    let indexArr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    indexArr = indexArr.split('')
    let msgArr = msg.split('')
    var answer = [];
    for(let i=0;i<msg.length;i++){
        let j=i+1;
        let str = msg[i]
        while(indexArr.includes(str)&&msg[j]){
            str+=msg[j]
            j++;
        }
        if(msg[j]){
            indexArr.push(str)
        }
        if(j>i+1){
        str = str.slice(0,-1)}
        answer.push(indexArr.indexOf(str)+1)
    }
    return answer;
}

처음 풀었던 풀이. 이렇게 풀면 안되는 이유는 answer배열에 추가해준 글자는 삭제해줘야해서.

 

function solution(msg) {
    //LZW압축
    //일단 해보고 재귀로 푸는 법 있나 생각해보기
    let indexArr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    indexArr = indexArr.split('')
    let msgArr = msg.split('')
    var answer = [];
    return strFn(msg,indexArr,answer)
}

function strFn(str,indexArr,answer){
    if(str.length===0) return answer
    let word =str[0];
    let wordIdx = 1;
    let last = false;
    for(let i=1;i<str.length;i++){
        if(indexArr.includes(word)&&str[i]){
            wordIdx = i
            word+=str[i]
        }
        else break;
    }
    let newWord=''
    let newStr = ''
    if(!indexArr.includes(word)){
    newWord = word.slice(0,-1)
    newStr = str.slice(wordIdx)
    }
    else{ newWord = word
         str.slice(wordIdx+1)}
    answer.push(indexArr.indexOf(newWord)+1)
     
    if(str[wordIdx]){
    indexArr.push(word)
    }
    return strFn(newStr,indexArr,answer)
}

다시 푼 풀이