プログラマ60057-文字列圧縮


質問リンク:プログラマ60057-文字列圧縮
マイプールリンク:Github - HeeJeYang
問題は解決しましたが、これは良いコードではないと思います.他の開発者の良い解答を見て、それらを理解して、私のものにしてみたいと思っています.

他の開発者の答え:

const solution = s => {
  const range = [...Array(s.length)].map((_, i) => i + 1); // 1번
  return Math.min(...range.map(i => compress(s, i).length)); // 4번
};

const compress = (s, n) => {
  const make = ([a, l, c]) => `${a}${c > 1 ? c : ''}${l}`;
  return make(
    chunk(s, n).reduce( // 3번
      ([a, l, c], e) => e === l ? [a, l, c + 1] : [make([a, l, c]), e, 1],
      ['', '', 0]
    )
  );
};

const chunk = (s, n) => // 2번
  s.length <= n ? [s] : [s.slice(0, n), ...chunk(s.slice(n), n)];

例(s=「abcabcdede」)


1番:圧縮を切り取る単位数を指定します.
(例:range = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]実際,文字列長の半分6以降は比較対象がないため,圧縮は不要である.
したがってconst range = [...Array(Math.floor(s.length / 2))].map((_, i) => i + 1);このようにrange = [1, 2, 3, 4, 5, 6]として記述され、コードに問題はなく、mapcompress関数を呼び出す回数を減らすことができ、より良いはずです.
2番:nの値単位で、文字列sを配列に切り取って返します.
(例:
console.log(chunk("abcabcdedede", 3)) // ["abc", "abc", "ded", "ede"]
console.log(chunk("abcabcdedede", 5)) // ["abcab", "cdede", "de"]
文字列の長さが単位の場合は、上のコードの2行目のように配列の末尾に貼り付けます.)
3番:この部分がわかりやすくなっていれば、書き込みをしたくなくなります.chunk関数が返す配列に圧縮可能な部分があるかどうかを調べる場所です.まず例を見てみましょう.
(例:compress("abcabcdedede", 3).
1.chunk("abcabcdedede", 3)の出力値は["abc", "abc", "ded", "ede"]2.reduce関数の内部で、初期値が["", "", 0]であり、現在値が"abc"である場合、e === lfalseであるため、アキュムレータ(acc)に格納された値は[make("", "", 0), "abc", 1]であり、make関数解は["", "abc", 1]である
3.次のループ(e = "abc"l === "abc")のe === ltrueであるため、アキュムレータ(acc)に格納された値は["", "abc", 2]である
4.次のループ(e === "ded"l === "abc")において、e === lfalseであるため、アキュムレータ(acc)に記憶された値はmake関数に算出され、["2abc", "ded", 1]が得られる
5.最後のループ(e === "ede"l === "ded")のe === lfalseであるため、["2abcded", "ede", 1]の値が返される
6.上記戻り値をmake関数に挿入し、得られた値"2abcdedede"を返します.)
4番:range.mapで、3番のプロセスをnの値に変更し、実行後に最も短い値を問題の答えに返します.

の最後の部分


実際の面接でこのような良いコードを実現できるように熟練しなければなりません.