第一の巻 総和と最大
初段 / 目安 15分
道場の正面に、カメ師範が自ら立っています。これまで師範は奥に控えているばかりでしたが、今日は違いました。「ここから先は、道具を選ばん。Python、JavaScript、TypeScript、Java——得物は自由。問うのは考え方のみじゃ。商店街の数字を使い、算法の腕を見せてもらおう」
師範が巻物を一つ、するりと開きます。「商店街の一日の売上高、ここに12店舗ぶんある。総和と最大、ライブラリの力を借りずに求めよ」
合計を出す関数も、最大値を出す関数も、どの言語にも用意されています。ここではそれを使いません。便利な道具の中で何が起きているのかを、自分の手で一度なぞるのが第一の巻の狙いです。
完成条件
売上高の配列を受け取り、合計と最大値を1つの文字列にして返す関数 sumAndMax を作ってください。どの言語で解く場合も、関数名は sumAndMax にしてください。
返す文字列の形は次のとおりです。
プレーンテキスト
合計 20600 / 最大 3200- 「合計」「/」「最大」の前後の半角スペースまで一致させること
- 数値の前後に余分な記号を付けないこと
- 配列には必ず1つ以上の要素が入っています
禁じ手
次の道具は使えません。ループと、足し算と、大小の比較だけで書いてください。
- Python の
summax - JavaScript / TypeScript の
reduceMath.max(...arr) - Java の
Arrays.stream(...).sum()IntStream.max()
進め方
白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。
合計と最大は、別々に2周する必要はありません。1周のあいだに両方を育てられます。最大値の初期値を何にするかだけは、先に決めてから書き始めてください。ここを 0 にしてしまうと、売上が全部マイナスの日に嘘をつく関数になります。
要件
- 関数名は sumAndMax。どの言語で解く場合も同じ名前にすること
- 合計と最大は、ループと足し算と比較だけで求めること
- sum / max / reduce / Math.max / stream などの合計・最大の道具を使わないこと
- 「合計 20600 / 最大 3200」の形の文字列を1つ返すこと。印字ではなく return で返す
入出力例
sumAndMax([1200,3200,800,1500,2400,900,1100,2600,700,1900,1300,3000]) → "合計 20600 / 最大 3200"
sumAndMax([500]) → "合計 500 / 最大 500"
sumAndMax([300,300,300]) → "合計 900 / 最大 300"
sumAndMax([10,900,20,880]) → "合計 1810 / 最大 900"
sumAndMax([4500,4500,120,60,4400]) → "合計 13580 / 最大 4500"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです
ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
編集 ゆめさく編集部