ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 3차 압축 js 풀이
    프로그래머스 2022. 2. 18. 23:18

    문제

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

     

    코딩테스트 연습 - [3차] 압축

    TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]

    programmers.co.kr

     

    차근차근 구현하면 되는 문제입니다.

     

    우선 Map을 통해 A부터 Z까지의 색인번호를 만들어 줍니다.

     

    const createDic = (dic) => {
      for (let i = "A".charCodeAt(); i <= "Z".charCodeAt(); i += 1) {
        const key = String.fromCharCode(i);
        const value = i - "A".charCodeAt() + 1;
        dic.set(key, value);
      }
    };

     

    다음으로 조건에 맞게 구현을 하면 됩니다.

    const createDic = (dic) => {
      for (let i = "A".charCodeAt(); i <= "Z".charCodeAt(); i += 1) {
        const key = String.fromCharCode(i);
        const value = i - "A".charCodeAt() + 1;
        dic.set(key, value);
      }
    };
    
    const solution = (msg) => {
      const dic = new Map();
      const ans = [];
      let lastIdx = 26;
      createDic(dic);
    
    
     msg.split("").reduce((acc, cur) => {
        nextWord = acc + cur;
        // // 키가 있는 경우 계속 더하면서 순회를 합니다.
        if (dic.has(nextWord)) {
          return nextWord;
        }
        // 키가 없는 경우 Map에 추가합니다.
        dic.set(nextWord, ++lastIdx);
        //이전 값을 Map에서 가져와 출력합니다.
        ans.push(dic.get(acc));
        return cur;
      }, "");
      ans.push(dic.get(nextWord));
      return ans;
    };

    하지만 이렇게 하면 마지막 값이 ans에 들어가지 않게 됩니다.

    키가 있다면 nextWord를 return하는데 다음 값이 없으므로 그냥 종료되고(두번째 입출력의 마지막 경우),

    키가 존재하지 않는다면 cur을 return하는데 다음 값이 없으므로 reduce가 그냥 종료됩니다.(첫번째 입출력의 경우 마지막 경우)

     

    따라서 마지막 값을 기억하는 변수를 만들어 준 후 reduce가 종료한다면 마지막값을 ans에 추가해 줍니다.

     

     

    최종 코드

    const createDic = (dic) => {
      for (let i = "A".charCodeAt(); i <= "Z".charCodeAt(); i += 1) {
        const key = String.fromCharCode(i);
        const value = i - "A".charCodeAt() + 1;
        dic.set(key, value);
      }
    };
    
    const solution = (msg) => {
      const dic = new Map();
      const ans = [];
      let lastIdx = 26;
      createDic(dic);
    
      let word = "";
      msg.split("").reduce((acc, cur) => {
        word = acc + cur;
        if (dic.has(word)) {
         // 값이 있다면 그냥 종료합니다. 17라인에서 word를 구해줬기 때문입니다.
          return word;
        }
        dic.set(word, ++lastIdx);
        ans.push(dic.get(acc));
        word = cur;
        // word를 cur로 초기화합니다. 마지막 변수는 계산되지 않기 때문입니다.
        return cur;
      }, "");
      // 마지막 word는 추가되지 않았기 때문에 추가합니다.
      ans.push(dic.get(word));
      return ans;
    };

    댓글

Designed by Tistory.