プログラマ60057-文字列圧縮
10806 ワード
質問リンク:プログラマ60057-文字列圧縮
マイプールリンク:Github - HeeJeYang
問題は解決しましたが、これは良いコードではないと思います.他の開発者の良い解答を見て、それらを理解して、私のものにしてみたいと思っています.
1番:圧縮を切り取る単位数を指定します.
(例:
したがって
2番:nの値単位で、文字列sを配列に切り取って返します.
(例:
3番:この部分がわかりやすくなっていれば、書き込みをしたくなくなります.
(例:
1.
3.次のループ(
4.次のループ(
5.最後のループ(
6.上記戻り値をmake関数に挿入し、得られた値
4番:
実際の面接でこのような良いコードを実現できるように熟練しなければなりません.
マイプールリンク: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]
として記述され、コードに問題はなく、map
がcompress
関数を呼び出す回数を減らすことができ、より良いはずです.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 === l
はfalse
であるため、アキュムレータ(acc)に格納された値は[make("", "", 0), "abc", 1]
であり、make関数解は["", "abc", 1]
である3.次のループ(
e = "abc"
、l === "abc"
)のe === l
はtrue
であるため、アキュムレータ(acc)に格納された値は["", "abc", 2]
である4.次のループ(
e === "ded"
、l === "abc"
)において、e === l
はfalse
であるため、アキュムレータ(acc)に記憶された値はmake関数に算出され、["2abc", "ded", 1]
が得られる5.最後のループ(
e === "ede"
、l === "ded"
)のe === l
はfalse
であるため、["2abcded", "ede", 1]
の値が返される6.上記戻り値をmake関数に挿入し、得られた値
"2abcdedede"
を返します.)4番:
range.map
で、3番のプロセスをn
の値に変更し、実行後に最も短い値を問題の答えに返します.の最後の部分
実際の面接でこのような良いコードを実現できるように熟練しなければなりません.
Reference
この問題について(プログラマ60057-文字列圧縮), 我々は、より多くの情報をここで見つけました https://velog.io/@heejeyang/프로그래머스-60057번-문자열-압축テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol