集計する処理の読み方(合計・個数・平均)
「配列の値を全部足す」「条件に合うものを数える」——第3問でもっともよく出る処理です。 形が決まっているので、型を覚えてしまえば一瞬で読めるようになります。 逆に、型を知らないと毎回1行ずつ考えることになり、時間が足りなくなります。
BASIC
集計はすべて「箱を用意して足していく」
合計を求めるプログラムは、例外なく次の3つの部分でできています。
- 箱を用意する …
total = 0(繰り返しの前) - 1つずつ足す …
total = total + Nums[i](繰り返しの中) - 結果を使う …
表示する(total)(繰り返しの後)
Nums = [2, 4, 6] total = 0 ← ① 箱を用意 i を 0 から 要素数(Nums) - 1 まで 1 ずつ増やしながら繰り返す: ⎿ total = total + Nums[i] ← ② 1つずつ足す 表示する(total) ← ③ 結果を使う
total = total + Nums[i] は「いまの total に Nums[i] を足した値を、あらためて total に入れる」という意味です。
数学の等式ではないので、「total と total + Nums[i] が等しい」と読むと混乱します。
右辺を計算してから左辺に入れる、と覚えてください。
| i | Nums[i] | 計算 | total |
|---|---|---|---|
| 開始前 | — | — | 0 |
| 0 | 2 | 0 + 2 | 2 |
| 1 | 4 | 2 + 4 | 6 |
| 2 | 6 | 6 + 4… ではなく 6 + 6 | 12 |
数える場合は「+ 1」
個数を数えるときも形は同じで、足す値が 1 に変わるだけです。
count = count + 1 と書けば、条件が成り立った回数を数えられます。
| 求めたいもの | 箱の初期値 | 繰り返しの中 |
|---|---|---|
| 合計 | total = 0 | total = total + Nums[i] |
| 個数 | count = 0 | count = count + 1 |
| 積 | p = 1 | p = p × Nums[i] |
EXERCISE 1
例題1:足す式を選ぶ
配列の値を順に total に加えるには、[ ア ]に何を入れればよいですか。
Nums = [2, 4, 6] total = 0 i を 0 から 要素数(Nums) - 1 まで 1 ずつ増やしながら繰り返す: ⎿ [ ア ] 表示する(total)
選択肢:① total = total + Nums[i] ② total = Nums[i] ③ Nums[i] = total + Nums[i] ④ total = total - Nums[i]
答えと解説を見る
答え:① total = total + Nums[i]
他の選択肢がなぜ違うのかを見ると、この形の意味がはっきりします。
- ② total = Nums[i] … 「足す」ではなく「入れ替える」になります。前の値が消えるので、 最後に残るのは最後の要素 6 だけです。合計になりません。
-
③ Nums[i] = total + Nums[i] …
左辺が
Nums[i]なので、配列のほうが書き換わってしまいます。 total は 0 のままです。 - ④ total = total - Nums[i] … 引き算なので total は −12 になります。
「左辺が箱、右辺が計算」という対応で見分けてください。 集計したい変数が左辺に来ていなければ、その選択肢は誤りです。
EXERCISE 2
例題2:条件をつけて数える
次のプログラムを実行したとき、表示される count の値として正しいものを選びなさい。
Nums = [1, 4, 6, 7, 10] count = 0 i を 0 から 要素数(Nums) - 1 まで 1 ずつ増やしながら繰り返す: |もし Nums[i] % 2 == 0 ならば: ⎿⎿ count = count + 1 表示する(count)
選択肢:① 2 ② 3 ③ 4 ④ 5
答えと解説を見る
答え:② 3
% は割った余りを求める記号です。
Nums[i] % 2 == 0 は「2で割った余りが0」、つまり偶数かどうかを判定しています。
| i | Nums[i] | ÷2 の余り | count |
|---|---|---|---|
| 0 | 1 | 1(奇数) | 0 |
| 1 | 4 | 0(偶数) | 1 |
| 2 | 6 | 0(偶数) | 2 |
| 3 | 7 | 1(奇数) | 2 |
| 4 | 10 | 0(偶数) | 3 |
偶数は 4、6、10 の3個です。 ④ の5は「要素の数」を答えてしまった場合、③ の4は奇数と偶数を取り違えた場合に選びます。
余りの判定はこの2つだけ覚えれば足ります。
% 2 == 0 が偶数、% 2 == 1 が奇数です。
% 3 == 0 なら「3の倍数」になります。
EXERCISE 3
例題3:値の条件か、添字の条件か
添字が偶数の要素だけを total に加えるには、[ ア ]に何を入れればよいですか。
Nums = [5, 8, 3, 6, 7, 2] total = 0 i を 0 から 要素数(Nums) - 1 まで 1 ずつ増やしながら繰り返す: |もし [ ア ] ならば: ⎿⎿ total = total + Nums[i] 表示する(total)
選択肢:① i % 2 == 0 ② i % 2 == 1 ③ Nums[i] % 2 == 0 ④ Nums[i] % 2 == 1
答えと解説を見る
答え:① i % 2 == 0
この問題の狙いは、「添字が偶数」と「値が偶数」の取り違えです。
問題文は「添字が偶数の要素」と言っているので、判定するのは i のほうです。
| i | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| Nums[i] | 5 | 8 | 3 | 6 | 7 | 2 |
| ① i が偶数 | ○ | ○ | ○ | |||
| ③ 値が偶数 | ○ | ○ | ○ |
① なら 5 + 3 + 7 = 15、③ なら 8 + 6 + 2 = 16 となり、答えがまったく変わります。
条件式の中身が i か Nums[i] か——ここだけを見れば見分けられます。
なお i % 2 == 0 は 0、2、4 を選ぶので、日常の言い方では
「1番目、3番目、5番目」にあたります。「偶数番目」という日本語と
ずれる点にも注意してください。
APPLY
平均と累積和
平均は「合計 ÷ 個数」
平均を求めるには、まず合計を出してから要素数で割ります。
avg = 合計(Scores) ÷ 要素数(Scores) という形になります。
注意点は割る順序と割り算の種類です。
要素数 ÷ 合計 と逆にする間違いのほか、
擬似言語の ÷ は整数どうしだと切り捨てになる場合があるため、
小数の平均を求めたいときは扱いに注意が必要です。
Python でも /(小数)と //(切り捨て)は別物です。
累積和は「途中経過を配列に残す」
合計は最後の1つの値しか残りませんが、各時点までの合計を並べたものを累積和といいます。
Nums = [2, 1, 3] Ans = [] s = 0 i を 0 から 要素数(Nums) - 1 まで 1 ずつ増やしながら繰り返す: |s = s + Nums[i] ⎿ Ans の末尾に s を追加する 表示する(Ans)
| i | Nums[i] | s | Ans |
|---|---|---|---|
| 0 | 2 | 2 | [2] |
| 1 | 1 | 3 | [2, 3] |
| 2 | 3 | 6 | [2, 3, 6] |
答えは [2, 3, 6] です。元の配列 [2, 1, 3] と混同しないでください。 累積和は「何日目までに何人来たか」「どこまでで目標に達したか」を調べる問題で使われます。 この形はシミュレーション型の問題でも登場します。
EXERCISE 4
例題4:平均を求める式を選ぶ
配列 Scores の平均値を avg に求めるプログラム表記として正しいものを選びなさい。
Scores = [60, 80, 100] # avg に平均値を入れる
選択肢:① avg = 合計(Scores) ÷ 要素数(Scores) ② avg = 要素数(Scores) ÷ 合計(Scores) ③ avg = 最大値(Scores) ÷ 要素数(Scores) ④ avg = Scores[0] + Scores[1] + Scores[2]
答えと解説を見る
答え:① avg = 合計(Scores) ÷ 要素数(Scores)
平均は「合計 ÷ 個数」です。 この配列なら 60 + 80 + 100 = 240 を 3 で割って 80 になります。
注目してほしいのは、合計() や 要素数() のような
用意された関数を使うと、繰り返しを書かずに済むという点です。
自分で書けば次のようになります。
total = 0 i を 0 から 要素数(Scores) - 1 まで 1 ずつ増やしながら繰り返す: ⎿ total = total + Scores[i] avg = total ÷ 要素数(Scores)
4行が1行になっただけで、やっていることは同じです。 出題では両方の書き方が登場するので、「この1行は繰り返し1つ分」と読み替えられるようにしておいてください。
- ② 要素数 ÷ 合計 … 3 ÷ 240 = 0.0125。割る順番が逆です。あわてると選んでしまいます
- ③ 最大値 ÷ 要素数 … 100 ÷ 3 で、平均とは無関係な値になります
- ④ Scores[0] + Scores[1] + Scores[2] … 合計の 240 が入るだけで、割っていません。 さらに要素が3つのときしか動かないという問題もあります
EXERCISE 5
例題5:条件が2つある場合
次のプログラムで、count = count + 1 は何回実行されますか。
Nums = [2, 5, 8, 11, 14, 17] count = 0 i を 0 から 要素数(Nums) - 1 まで 1 ずつ増やしながら繰り返す: |もし Nums[i] % 3 == 2 かつ Nums[i] > 10 ならば: ⎿⎿ count = count + 1 表示する(count)
選択肢:① 2回 ② 3回 ③ 5回 ④ 6回
答えと解説を見る
答え:② 3回
条件が 「かつ」でつながれています。 この場合、両方が成り立ったときだけ中身が実行されます。 片方だけでは足りません。
こういう問題は条件ごとに列を分けた表を書くと、まず間違えません。
| Nums[i] | 3で割った余り | 余り = 2? | 10より大きい? | 両方? |
|---|---|---|---|---|
| 2 | 2 | ○ | × | × |
| 5 | 2 | ○ | × | × |
| 8 | 2 | ○ | × | × |
| 11 | 2 | ○ | ○ | ○ |
| 14 | 2 | ○ | ○ | ○ |
| 17 | 2 | ○ | ○ | ○ |
この配列はすべての値が「3で割ると余り2」になっています。 つまり1つ目の条件は全部○で、勝負を決めているのは2つ目の「10より大きい」だけです。 11・14・17 の 3回が答えになります。
- ④ 6回 … 1つ目の条件だけを見て、全部○と数えた場合です
- ③ 5回 … 「かつ」を「または」と読み違えると、この形に近い数え方になります
%(余り)の意味があいまいなら、演算子の一覧で確認してください。
CODE
3つの表記での書き方の違い
Nums = [1, 4, 6, 7, 10] total = 0 count = 0 i を 0 から 要素数(Nums) - 1 まで 1 ずつ増やしながら繰り返す: |total = total + Nums[i] |もし Nums[i] % 2 == 0 ならば: ⎿⎿ count = count + 1 表示する(total, count)
nums = [1, 4, 6, 7, 10]
total = 0
count = 0
for i in range(len(nums)):
total = total + nums[i]
if nums[i] % 2 == 0:
count = count + 1
print(total, count)
const nums = [1, 4, 6, 7, 10];
let total = 0;
let count = 0;
for (let i = 0; i < nums.length; i++) {
total = total + nums[i];
if (nums[i] % 2 === 0) {
count = count + 1;
}
}
console.log(total, count);
%、Python と JavaScript は半角の % を使います。
意味はどれも「割った余り」で同じです。
また Python・JavaScript には total += nums[i] という短い書き方もありますが、
意味は total = total + nums[i] とまったく同じです。
CHECK
このテーマのチェックリスト
- 集計が「箱を用意 → 足す → 使う」の3部構成だと分かる
total = total + Nums[i]を「右辺を計算して左辺に入れる」と読める- 数えるときは
+ 1、掛けるときは初期値 1 だと分かる % 2 == 0が偶数判定だと即答できる- 条件式が
iかNums[i]かで添字条件か値条件かを見分けられる - 累積和が途中経過を並べた配列だと分かる
- 平均が 合計 ÷ 要素数 で、順番を逆にできないと分かる
- 「かつ」は両方、「または」はどちらかだと区別して数えられる
集計が読めるようになったら、次は最大値を探す・値を探すへ。 同じ「箱を用意して更新する」形が、条件を変えて出てきます。