PS(Javascript)

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

같이긍뱅와 2023. 7. 6. 17:06

문제

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

풀이

무언가 map형태의 자료형을 사용해야할 거 같은 느낌이 드는 문제이다. 카카오 문제가 유독 map을 쓰는 문제가 많은 느낌이다.
JS는 비슷하지만 다른 자료형으로 Object가 있어서 그것을 사용해주었다. 중요한 것은 여기서 출력과 사전에 추가되는 부분이 있는데
정답 배열에는 출력이 되는 그러니까 object에 mapping이 되는 부분을 넣어줘야한다.

  1. 먼저 압축 알고리즘이 영어 대문자로만 초기화 된다고 되어있기 때문에 알파벳 A-Z까지의 문자를 obj에 등록해준다. 이 때 c/c++ 처럼 아스키 코드를 문자로 치환해주는 method로 fromCharCode를 썼다.
     const dict = {};
     for(let i = 0; i < 26; i++) {
         dict[String.fromCharCode(i+65)] = i+1;
     }
  2. 그러면 이제 다음에 추가되는 문자열 부터는 value 값이 27이 되어야하기 때문에 index = 27로 설정해준다.
  3. 그리고 메세지 길이만큼 돌면서 mapping이 되는 dict[key] 했을 때 undefined가 되지 않는것은 정답 배열에 추가해주고 아닌 것은 dict에 새롭게 등록해준다.

코드

function solution(msg) {
    var answer = [];
    const dict = {}
    for(let i = 0; i < 26; i++) {
        dict[String.fromCharCode(i+65)] = i+1;
    }
    let idx = 27;
    for(let i = 0; i < msg.length; i++) {
        let a = msg[i];
        let b = msg[i+1];
        while(dict[a+b] && i < msg.length-1) {
            i++
            a += b;
            b = msg[i+1];
        }
        answer.push(dict[a]);
        dict[a+b] = idx++;
    }
    return answer;
}