なんか急に簡単じゃね?
処理自体4行で書けたんだけど、これホントにSランクなの?
面倒くさいので画面パタメータをListでもらった後のFunctionだけ
ちなみに引数のListを作ってる箇所はこっちの記事に書いてあるYO!!
wordCollection.js
// [問題文(原文)]
// あなたは文字列の愛好家で、文字列を収集することにとても熱心です。
//
// 文字列は市場で高値で取引されています。今、市場には N 個の文字列が出まわっており、文字列 S_i (1 ≦ i ≦ N) の価格は P_i です。 あなたは数ある文字列の中でも、とくに先頭がある特定の文字列で始まる文字列に興味があり、そのような文字列をすべて買い占めたいです。例え、同じ文字列が複数売っていたとしてもそのすべてを買います。
//
// そこで、市場に出回っている N 個の文字列 S_i とそれぞれの価格 P_i (i ≦ i ≦ N)、また、M 個のクエリ文字列 Q_i (1 ≦ i ≦ M) が与えられるので、それぞれのクエリ Q_i に対し、市場に出回っている文字列の中で先頭が Q_i で始まる文字列すべてを買い占めるのに必要な金額を出力するプログラムを作成してください。
function wordCollection(lines) {
// 入力は以下のフォーマットで与えられます。
//
// N M
// S_1 P_1
// S_2 P_2
// ...
// S_N P_N
// Q_1
// Q_2
// ...
// Q_M
//
// ただし、文字列 S_i, Q_j (1 ≦ i ≦ N, 1 ≦ j ≦ M) は英小文字のみから構成されます。P_i は整数です。
const [N, M] = lines[0].split(" ").map(v => Number(v));
const words = lines.slice(1, N + 1).map(line => line.split(" ")).map(([word, price]) => ({ word, price: Number(price) }));
// それぞれのクエリに対し、必要な金額を一行に出力してください。
lines.slice(N + 1).forEach(word => console.log(words.filter(w => w.word.startsWith(word)).reduce((acc, cur) => acc + cur.price, 0)));
}
module.exports = {
wordCollection
};
コレなんか引っ掛け有るんか?
追記
本記事が、@setowatson 様の方で紹介されまして、
mapやfilterやreduceやらが分かりにくい(繋げて書くとコードが複雑化してしまう)というご感想を頂いたので、
初心者向けに、無課金初期装備(forやifとかの基本構文のみ)で書き直してみたのも公開してみる試みです。
初心者向け
function wordCollection(lines) {
const [N, M] = lines[0].split(" ").map(v => Number(v));
// 超初心者っぽく書いてみた
const words = [];
// 販売されてるアイテムを検索しやすい形(JSONの配列)に変換
for (let i = 1; i <= N; i++) {
const item = lines[i].split(" ");
words.push({
word: item[0],
price: Number(item[1])
});
}
// 買い占めたい文字分ループ
for (let i = N + 1; i <= N + M; i++) {
// 購入金額合計
let price = 0;
for (let j = 0; j < N; j++) {
// 頭始まりのチェック
if (words[j].word.startsWith(lines[i])) {
// 金額の加算
price += words[j].price;
}
}
console.log(price);
}
}
module.exports = {
wordCollection
};
コード量的にはだいぶ肥大化したけど、コレなら無課金ユーザでも簡単に読めるよね?(ニッコリ