본문 바로가기
Algorithm/프로그래머스[Programmers]

[JS] 2018카카오 : 압축 프로그래머스 LEVEL2

by jgo 2022. 6. 13.

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/17684

풀이 전략

1. 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다.
2. 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다.
3. w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
4. 입력에서 처리되지 않은 다음 글자가 남아있다면(c), w+c에 해당하는 단어를 사전에 등록한다.

문제에서 말하는 그대로 구현하면 되는 문제이다. 나는 너무 어렵게 생각하여 한참을 돌아갔다.

코드 

function solution(msg) {
    const answer = [];
    const dict = new Map();
    let idx = 0;

    while (idx < 26) {
        dict.set(String.fromCharCode(idx + 65), idx);
        idx++;
    }

    for (let i = 0; i < msg.length; i++) {
        let str = "";
        let add = i;
        str += msg[i];

        while (dict.has(str)) {
            add++;
            if (add === msg.length) break;
            str += msg[add];
        }
        if (add === msg.length) answer.push(dict.get(str) + 1);
        else answer.push(dict.get(str.slice(0, -1)) + 1);

        dict.set(str, idx++);
        i = add - 1;
    }

    return answer
}

 

회고

도움받은 블로그

w와 c를 하나의 str에 담으려다 보니, 문제에서 많이 헤맸다. 처음부터 따로 설정하였다면 str.slice(0, -1) 그리고 add = msg.length 와 같은 코드는 적지 않았을 것 같다.
풀이의 기본전략은 dict를 만들어 이 dict에 값이 존재하지 않을때까지 while문을 돌린 뒤 str을 dict에 추가하고 하나를 제거한 문자열을의 값을 answer배열에 추가하는 방식이다. 
하지만 기본적으로 str에 msg[i]를 더하는 방식이다 보니 맨끝으로 넘어가는 상황이 발생하여서 임시방편으로
if(add == msg.length) break;

 

와 같은 코드를 적다 보니 문제를 풀긴 하였지만 썩 마음에 들지 않는다. 문제를 푼 후 다른 분들의 코드를 참고하였는데, 정말 간결하게 잘 푸신 분들이 많아서 배울 수 있었다. 내 코드는 문제를 만나면 그것에 집중하여 피해나가는 식이라면 다른 분들은 애초에 설계할 때 부터 이 문제를 예상하고 작성에 들어가신 것 같았다. 스킬체크에서 만난 문제였는데, 조금 더 쉽게 풀 수 있지 않았을까 싶다. 

 

더 좋은 방법이나 의견이 있으시다면 댓글 부탁드립니다 :)

댓글