[プログラマー]圧縮-javascript


📖 質問リンク
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.もしなかったら、あらかじめ追加があれば、現在の次のアルファベットで加算した文字で返します
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はやはり使い方が尽きないと思います.bb2022.02.15