令和元年度 秋期 午前 問9
アルゴリズム
配列に関する問題
配列 A が図2の状態のとき,図1の流れ図を実行すると,配列 B が図3の状態になった。図1のaに入れる操作はどれか。ここで,配列 A,B の要素をそれぞれ A(i, j),B(i, j) とする。
図1 流れ図:
開始 ↓ ループ1 i:0, 1, 7(注) ↓ ループ2 j:0, 1, 7(注) ↓ a ↓ ループ2(終わり) ↓ ループ1(終わり) ↓ 終了
(注)ループ端の繰返し指定は,変数名:初期値,増分,終値 を示す。
図2 配列 A の状態(行が i,列が j。`*` が要素の在る位置):
| i\j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 0 | * | * | * | * | * | * | ||
| 1 | * | |||||||
| 2 | * | |||||||
| 3 | * | * | * | * | ||||
| 4 | * | |||||||
| 5 | * | |||||||
| 6 | * | |||||||
| 7 | * |
図3 実行後の配列 B の状態:
| i\j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 0 | ||||||||
| 1 | * | * | * | * | * | * | * | * |
| 2 | * | * | ||||||
| 3 | * | * | ||||||
| 4 | * | * | ||||||
| 5 | * | |||||||
| 6 | * | |||||||
| 7 |
- アB(7−i, 7−j) ← A(i, j)
- イB(7−j, i) ← A(i, j)
- ウB(i, 7−j) ← A(i, j)
- エB(j, 7−i) ← A(i, j)
答えと解説を見る
✓ これが正解エB(j, 7−i) ← A(i, j)
解説
行と列を入れ替えたうえで、行番号だけを七から引く操作です。
配列の添字を組み替える問いは、目印になる形を一つ選んで追うのが近道です。元の配列で分かりやすいのは、縦一列に並んだ列1の八個です。移した後の配列では、行1が横一列に八個そろっています。縦に並んでいたものが横になったのですから、行と列が入れ替わっています。入れ替えるだけなら、元の位置の行番号がそのまま新しい列番号になるはずです。ところが元は上から下へ、移した後は右から左へ並んでいます。つまり片方の数え方が逆向きになっているので、七から引く形が必要です。元の行0にあった横並びが、移した後は列7の縦並びに変わっている点も、まったく同じ形です。行と列を入れ替え、そのうえで行番号だけを七から引く。これが求める操作です。目印を二つ選び、両方が合うかどうかを確かめれば、それがそのまま検算になります。
ほかの選択肢はなぜ違うのか
- アB(7−i, 7−j) ← A(i, j…:行と列をどちらも七から引く操作で、図全体を点対称に回します。縦と横の向きは変わらないので、縦一列は縦一列のままです。横一列に変わったという手がかりに合いません。回すのか入れ替えるのかは、まず向きで見分けます。
- イB(7−j, i) ← A(i, j):行と列を入れ替えたうえで、列番号のほうを七から引いています。引く相手が逆なので、できあがる形は正解を裏返した位置になります。二つの添字のどちらに引き算が付くかで、できあがる位置は大きく違ってきます。
- ウB(i, 7−j) ← A(i, j):行はそのままで、列番号だけを七から引く操作です。左右を裏返すだけなので、縦に並んだものは縦のまま残ります。入れ替えが起きていないことは、目印を一つ追えば分かります。左右の裏返しは、行番号にはまったく影響しません。
出典:令和元年度 秋期 基本情報技術者試験 午前 問9
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)