[프로그래머스] 압축 - javascript

김지원·2022년 2월 15일
0

coding-test

목록 보기
23/25
post-thumbnail

📖 문제링크

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

문제 설명

무손실 압축 알고리즘을 이용해 사전에 문자를 추가하고 그 번호를 반환해라

👨‍💻 문제풀이

필자가 푼 문제풀이

function solution(msg) {
    const answer = [];
    let nextWord = "";
    let lastCount = 27;
    const dir = {
                 A: 1, B: 2, C: 3, D: 4, 
                 E: 5, F: 6, G: 7, H: 8, 
                 I: 9, J: 10, K: 11, L: 12, 
                 M: 13, N: 14, O: 15, P: 16, 
                 Q: 17, R: 18, S: 19, T: 20, 
                 U: 21, V: 22, W: 23, 
                 X: 24, Y: 25, Z: 26
                };
   const s = msg.split("").reduce((acc, cur) => {
       nextWord = acc + cur;
       if (dir[nextWord] === undefined) {
           dir[nextWord] = lastCount++;
       } else {
           return acc + cur;
       }
       if (dir[acc] !== undefined) answer.push(dir[acc]);
       return cur;
   });
   
   answer.push(dir[s]);
    
   return answer;
}

문자열을 이어붙이고 비교하는 것을 보니 딱 reduce연산자가 생각이 났다.
필자는 먼저 알파벳을 키값으로 한 객체를 만든 후
1. 현재 글자와 다음 글자를 더한 부분이 사전에 있는지 비교
2. 없다면 사전에 추가 있다면 다음 현재 글자를 합친 글자로 return
3. 그 다음 순번에 그 글자가 사전에 있다면 그 번호를 정답 배열에 추가해주었다.

⭐ 지금 만들어둔 reduce연산자에는 마지막에 현재 글자를 리턴하면서 끝이 나기 때문에 변수에 담아 제일 끝에 정답 배열에 저장해 두어야 한다.

👨‍💻 다른 사람의 풀이

const list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
const dic = list.reduce((d, a, i) => (d[a] = i + 1, d), {})

다른 사람의 풀이에서 알파벳이 들어있는 사전 객체를 reduce를 이용해 만들 수도 있다라는 것을 알게 되었다.

reduce는 역시 사용법이 무궁무진하다고 생각된다. bb

2022.02.15

profile
backend-developer

0개의 댓글