二次元配列の行ごとの合計|擬似言語のトレース解説と練習問題

レベル:基礎 / タグ:for・二重ループ・二次元配列

関数 rowSum は、二次元配列 m の行ごとの合計を求め、その並びを配列で返す。m[r, c] は r 行目の c 列目の要素を表す。配列の要素番号は 1 から始まる。

プログラム

1○整数型の配列: rowSum(整数型の二次元配列: m)
2 整数型の配列: out ← {}
3 整数型: r, c, sum
4 for (r を 1 から mの行数 まで 1 ずつ増やす)
5 sum ← 0
6 for (c を 1 から mの列数 まで 1 ずつ増やす)
7 sum ← sum + m[r, c]
8 endfor
9 outの末尾に sum を追加する
10 endfor
11 return out

何をしているか

外側の繰返しで行を、内側の繰返しで列を進め、行ごとに要素を合計します。行が変わるたびに合計を 0 に戻し、1行分が終わったら結果の配列の末尾に追加します。

トレースのコツ

  • m[r, c] は「r 行目の c 列目」です。行が先、列が後です。
  • 内側の繰返しが1周するあいだ、r は変わりません。c だけが 1 から列数まで進みます。
  • sum ← 0 がどこにあるかが要点です。外側の繰返しの中にあるので、行ごとに合計がやり直されます。

よくある間違い

  • 行と列を逆に読む。{{1, 2, 3}, {4, 5, 6}} は2行3列で、m[2, 1] は 4 です。
  • 足し込みの回数を「行数 + 列数」と数える。正しくは「行数 × 列数」です。
  • sum を 0 に戻すのを忘れ、前の行の合計に足し続けてしまう。

例題:rowSum({{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}) を最後まで追う

上のプログラムを rowSum({{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。

#行したことmoutrcsum
12宣言{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}———
23宣言{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}未設定未設定未設定
34繰返しの初期化{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}1未設定未設定
44条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}1未設定未設定
55代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}1未設定0
66繰返しの初期化{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}110
76条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}110
87代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}112
96繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}122
106条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}122
117代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}125
126繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}135
136条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}135
147代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}1310
156繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}1410
166条件判定(偽){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{}1410
179追加{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}1410
184繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}2410
194条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}2410
205代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}240
216繰返しの初期化{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}210
226条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}210
237代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}211
246繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}221
256条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}221
267代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}223
276繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}233
286条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}233
297代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}239
306繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}249
316条件判定(偽){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10}249
329追加{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}249
334繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}349
344条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}349
355代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}340
366繰返しの初期化{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}310
376条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}310
387代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}319
396繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}329
406条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}329
417代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}3214
426繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}3314
436条件判定(真){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}3314
447代入{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}3323
456繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}3423
466条件判定(偽){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9}3423
479追加{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9, 23}3423
484繰返しの更新{{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9, 23}4423
494条件判定(偽){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9, 23}4423
5011戻る({10, 9, 23}){{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}{10, 9, 23}4423

この例題で問われること

問 rowSum({{2, 3, 5}, {1, 2, 6}, {9, 5, 9}}) を呼び出したときの戻り値はどれか。

答え {10, 9, 23}

  • 戻り値になる out は、{} → {10} → {10, 9} → {10, 9, 23} と変わります。
  • 11行目で返す時点の値 {10, 9, 23} が答えです。

問 7行目を6回目に実行した直後の、変数 sum の値はどれか。

答え 9

  • 7行目は全部で9回実行されます。
  • 実行した直後の sum は、順に 2 → 5 → 10 → 1 → 3 → 9 → 9 → 14 → 23 です。
  • 6回目の直後なので、答えは 9 です。

問 7行目が実行される回数はどれか。

答え 9

  • 7行目が実行されるのは、6行目の条件が真になったときだけです。
  • 6行目の条件は12回評価され、真になるのは9回です。したがって 7行目は9回実行されます。

練習問題 標準(5問)

本試験と同じくらいの量。レベル:基礎

  1. 問題01 rowSum({{4, 5, 5}, {9, 6, 3}})
  2. 問題02 rowSum({{4, 7, 9}, {5, 2, 5}})
  3. 問題03 rowSum({{1, 2}, {1, 6}})
  4. 問題04 rowSum({{3, 6, 9}, {2, 5, 1}})
  5. 問題05 rowSum({{5, 1}, {4, 3}})
もっと解く(追加の10問)
  1. 問題06 rowSum({{8, 3, 3}, {3, 1, 5}})
  2. 問題07 rowSum({{5, 4}, {8, 6}})
  3. 問題08 rowSum({{2, 2}, {5, 8}})
  4. 問題09 rowSum({{3, 8, 9}, {2, 8, 8}})
  5. 問題10 rowSum({{8, 1}, {5, 8}})
  6. 問題11 rowSum({{9, 5}, {8, 8}})
  7. 問題12 rowSum({{5, 1}, {8, 9}})
  8. 問題13 rowSum({{8, 7, 8}, {5, 6, 8}})
  9. 問題14 rowSum({{2, 5}, {7, 9}})
  10. 問題15 rowSum({{5, 9}, {5, 6}})

練習問題 じっくり(10問)

長めのトレースで力をつける。レベル:中級

  1. 問題01 rowSum({{6, 3, 9}, {8, 6, 1}, {3, 4, 1}, {3, 9, 8}})
  2. 問題02 rowSum({{7, 3, 3}, {4, 3, 7}, {3, 6, 9}})
  3. 問題03 rowSum({{4, 8}, {2, 6}, {1, 3}, {5, 6}})
  4. 問題04 rowSum({{9, 3}, {9, 1}, {3, 3}})
  5. 問題05 rowSum({{6, 1, 8}, {5, 5, 8}, {1, 8, 5}})
  6. 問題06 rowSum({{5, 7, 9}, {7, 9, 9}, {2, 7, 3}, {5, 4, 7}})
  7. 問題07 rowSum({{5, 5, 1}, {9, 1, 3}, {7, 3, 4}, {6, 5, 1}})
  8. 問題08 rowSum({{9, 1}, {7, 6}, {8, 9}, {3, 2}})
  9. 問題09 rowSum({{7, 5, 7}, {8, 9, 3}, {6, 2, 1}, {4, 8, 8}})
  10. 問題10 rowSum({{7, 4, 6}, {6, 1, 4}, {9, 7, 4}, {1, 6, 9}})
もっと解く(追加の20問)
  1. 問題11 rowSum({{8, 8}, {7, 7}, {1, 8}})
  2. 問題12 rowSum({{1, 9}, {3, 1}, {4, 9}})
  3. 問題13 rowSum({{2, 1}, {4, 2}, {8, 3}})
  4. 問題14 rowSum({{3, 7, 4}, {9, 1, 3}, {3, 9, 9}, {2, 3, 5}})
  5. 問題15 rowSum({{3, 5, 3}, {5, 2, 3}, {3, 5, 7}})
  6. 問題16 rowSum({{8, 7}, {9, 2}, {6, 6}, {4, 9}})
  7. 問題17 rowSum({{9, 5, 8}, {2, 8, 9}, {6, 1, 3}})
  8. 問題18 rowSum({{1, 2}, {9, 5}, {3, 9}})
  9. 問題19 rowSum({{2, 9, 6}, {1, 1, 1}, {9, 9, 4}})
  10. 問題20 rowSum({{1, 8}, {9, 6}, {9, 9}})
  11. 問題21 rowSum({{6, 9, 2}, {8, 8, 6}, {6, 7, 5}, {6, 1, 1}})
  12. 問題22 rowSum({{1, 5}, {7, 1}, {7, 6}, {6, 3}})
  13. 問題23 rowSum({{9, 1, 8}, {4, 3, 6}, {4, 7, 7}, {2, 2, 4}})
  14. 問題24 rowSum({{4, 4}, {3, 9}, {1, 8}})
  15. 問題25 rowSum({{1, 5, 8}, {2, 2, 6}, {5, 1, 2}})
  16. 問題26 rowSum({{4, 4}, {3, 7}, {3, 4}})
  17. 問題27 rowSum({{9, 2, 1}, {7, 6, 5}, {7, 5, 1}})
  18. 問題28 rowSum({{9, 6}, {8, 3}, {6, 6}})
  19. 問題29 rowSum({{2, 3}, {4, 8}, {7, 8}})
  20. 問題30 rowSum({{8, 1}, {7, 9}, {5, 3}, {2, 6}})

ほかのアルゴリズム