본문 바로가기

코딩테스트

[프로그래머스] level2. [3차] 압축 (javascript)

반응형

문제

프로그래머스 문제 링크

나의 풀이

function solution(msg) {
    var answer = [];
    let obj = {};
    let arr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    arr = arr.split("");
    for(let i = 0 ; i < arr.length;i++){
        obj[arr[i]] = i+1
    }

    let max = 1;
    for(let i = 0 ; i < msg.length;){
        let w = msg[i];
        for(let j = 0 ; j < max;j++){
            const tmpw = msg.substring(i,i+max-j)
            if(obj[tmpw]){
                w = tmpw
                break;
            }
        }
        let c = msg[i+w.length];
        if (!c) c= ""
        if (!w) break;
        if(obj[w]){
            const sum = w+c;
            answer.push(obj[w]);
            arr.push(sum);    

            obj[sum] = arr.length;    

            max = max > sum.length ? max : sum.length
            i = i+w.length;
        }
    }
    return answer;
}

 

- 초기 A-Z까지 배열과 obj를 선언해준다.

- for문으로 msg를 읽으면서, 속에 다시 for문을 돌려 조건에 맞는 w와c를 넣어준다.

- 정답은 answer배열에 push해준다.

 

다른이의 풀이 보며 보완

1.

    for(let i = 0 ; i < arr.length;i++){
        obj[arr[i]] = i+1
    }

이 부분을

 

    var dic = list.reduce((d, a, i) => (d[a] = i + 1, d), {})

이렇게 선언해 줄 수 있었다.

 

2.

        for(let j = 0 ; j < max;j++){
            const tmpw = msg.substring(i,i+max-j)
            if(obj[tmpw]){
                w = tmpw
                break;
            }
        }

나는 끝부분 부터 확인하도록 구성하였는데,

 

        while (dic[w+c] && i < msg.length - 1) {
            i++;

            w = w+c;
            c = msg[i+1];
        }

 

이렇게 while문을 사용하고, 기존의 i를 이용해서 앞에서부터 확인하면 i를 따로 작업해주지 않아도 되고,substring도 안써도 되며, max변수값을 안써도 되므로 더 괜찮은 것 같다. 대신 기존 for문에 i++를 추가해줘야된다.

반응형