IT1-CODE-POCKET

集計する処理の読み方(合計・個数・平均)

「配列の値を全部足す」「条件に合うものを数える」——第3問でもっともよく出る処理です。 形が決まっているので、型を覚えてしまえば一瞬で読めるようになります。 逆に、型を知らないと毎回1行ずつ考えることになり、時間が足りなくなります。

BASIC

集計はすべて「箱を用意して足していく」

合計を求めるプログラムは、例外なく次の3つの部分でできています。

  1. 箱を用意するtotal = 0(繰り返しの
  2. 1つずつ足すtotal = total + Nums[i](繰り返しの
  3. 結果を使う表示する(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] が等しい」と読むと混乱します。 右辺を計算してから左辺に入れる、と覚えてください。

iNums[i]計算total
開始前0
020 + 22
142 + 46
266 + 4… ではなく 6 + 612

数える場合は「+ 1」

個数を数えるときも形は同じで、足す値が 1 に変わるだけです。 count = count + 1 と書けば、条件が成り立った回数を数えられます。

求めたいもの 箱の初期値 繰り返しの中
合計 total = 0 total = total + Nums[i]
個数 count = 0 count = count + 1
p = 1 p = p × Nums[i]
積のときだけ初期値は 1 です。 0 から始めると、何を掛けても 0 のままになってしまいます。 「なぜ 0 ではないのか」を問う出題があります。

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」、つまり偶数かどうかを判定しています。

iNums[i]÷2 の余りcount
011(奇数)0
140(偶数)1
260(偶数)2
371(奇数)2
4100(偶数)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 のほうです。

i012345
Nums[i]583672
① i が偶数
③ 値が偶数

① なら 5 + 3 + 7 = 15、③ なら 8 + 6 + 2 = 16 となり、答えがまったく変わります。 条件式の中身が iNums[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)
iNums[i]sAns
022[2]
113[2, 3]
236[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つのときしか動かないという問題もあります
④ が「間違い」である理由は2つあります。 平均になっていないことに加えて、要素数が変わると書き直しが必要だからです。 繰り返しを使う本当の理由は「短く書くため」ではなく、 データの個数が変わっても同じプログラムで動かすためです。

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より大きい?両方?
22××
52××
82××
112
142
172

この配列はすべての値が「3で割ると余り2」になっています。 つまり1つ目の条件は全部○で、勝負を決めているのは2つ目の「10より大きい」だけです。 11・14・17 の 3回が答えになります。

  • ④ 6回 … 1つ目の条件だけを見て、全部○と数えた場合です
  • ③ 5回 … 「かつ」を「または」と読み違えると、この形に近い数え方になります
「かつ」と「または」を読み飛ばさないでください。 「かつ」は両方そろって○、「または」はどちらか1つでも○です。 条件が2つ以上あるときは、上のように条件ごとに列を作った表を書くのが確実です。 (余り)の意味があいまいなら、演算子の一覧で確認してください。

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)
余りの記号:擬似言語は全角の 、Python と JavaScript は半角の % を使います。 意味はどれも「割った余り」で同じです。 また Python・JavaScript には total += nums[i] という短い書き方もありますが、 意味は total = total + nums[i] とまったく同じです。

CHECK

このテーマのチェックリスト

集計が読めるようになったら、次は最大値を探す・値を探すへ。 同じ「箱を用意して更新する」形が、条件を変えて出てきます。

次に読むページ