基本情報技術者 2019年 秋期 午前(科目A) 問09
問題文
配列が図2の状態のとき、図1の流れ図を実行すると、配列Bが図3の状態になった。図1の a に入れる操作はどれか。ここで、配列A,Bの要素をそれぞれ、とする。

選択肢
ア:
イ:
ウ:
エ:(正解)
配列Aから配列Bへの座標変換(回転)【午前2 解説】
要点まとめ
- 結論:配列Aを90度時計回りに回転させる操作は B(j,7-i) ← A(i,j) で表され,選択肢はエが正解です。
- 根拠:i を行(下方向),j を列(右方向)とすると行→列,列→(7−行) の変換で90度時計回りになるためです。
- 差がつくポイント:代表点を3点以上確認して写像の向き(時計回りか反時計回りか)と原点(反転の有無)を確かめることです。
正解の理由
正解は エ の B(j,7-i) ← A(i,j) です。
理由は次のとおりです。配列のインデックス i が「下方向」、j が「右方向」を表すとき,ある要素 A(i,j) を90度時計回りに回転すると、新しい行は元の列 j になり,新しい列は元の行 i を下から見て反転した位置 (N−1−i, ここで N=8) になります。したがって一般式は B(j, N−1−i) ← A(i,j) であり,本問では N−1=7 のため B(j,7-i) ← A(i,j) が対応します。図2の代表点(例えば A(0,7) が B(7,7) に,A(3,0) が B(0,4) に)などを当てはめれば,図3の配置と一致するのでエが正解です。
理由は次のとおりです。配列のインデックス i が「下方向」、j が「右方向」を表すとき,ある要素 A(i,j) を90度時計回りに回転すると、新しい行は元の列 j になり,新しい列は元の行 i を下から見て反転した位置 (N−1−i, ここで N=8) になります。したがって一般式は B(j, N−1−i) ← A(i,j) であり,本問では N−1=7 のため B(j,7-i) ← A(i,j) が対応します。図2の代表点(例えば A(0,7) が B(7,7) に,A(3,0) が B(0,4) に)などを当てはめれば,図3の配置と一致するのでエが正解です。
よくある誤解
- 「i と j を逆に見てしまう」:行と列の役割を取り違えると90度回転と180度反転を混同します。
- 「反転軸の向き(N−1 の扱い)を忘れる」:回転では座標の反転(7−i 等)が必要になる点を見落としやすいです。
- 「代表点を1つだけ確認する」:1点だけだと反時計回りや鏡映と区別できないため,複数点で検証してください。
解法ステップ
- i(行)と j(列)の定義を確認する(i は下方向,j は右方向)。
- 図2→図3 の変化で,ある分かりやすい点を対応づける(例:角の点や直線状のまとまり)。
- 行が列に,列が行に移るかどうかを判定する(入れ替えがあるなら回転の可能性)。
- 反転(N−1−i や N−1−j)が必要か確認する(向きが逆になる場合)。
- 得られた変換式と選択肢を照合して一致するものを選ぶ。
選択肢別の誤答解説
- ア: B(7-i,7-j) ← A(i,j)
- これは180度回転(あるいは両軸反転)に相当します。行も列も反転するため,90度回転の図とは合いません。
- イ: B(7-j,i) ← A(i,j)
- これは90度反時計回り(左回り)の変換です。向きが逆なので図の向きと一致しません。
- ウ: B(i,7-j) ← A(i,j)
- これは水平方向(列)だけ反転する操作で,行と列の入れ替えがなく回転にはなりません。
- エ: B(j,7-i) ← A(i,j)
- これは行列全体を90度時計回りに回転する式で,図の変化と整合します(正解)。
補足コラム
- 8×8 の正方行列での一般形:N×N 行列(0〜N−1)の90度時計回りは B(j, N−1−i) ← A(i,j),反時計回りは B(N−1−j, i) ← A(i,j) です。
- 視覚的に判断するときは「上の行が右の列になる(時計回り)」か「上の行が左の列になる(反時計回り)」で素早く識別できます。
以下は変換を確かめる簡単な例(Python)。A の★位置をリストで与えて B を作る処理です。
N = 8
A_stars = [(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),
(1,0),(2,0),(3,0),(3,1),(3,2),(3,3),(3,4),
(4,0),(5,0),(6,0),(7,0)]
B = set()
for i,j in A_stars:
B.add((j, N-1-i)) # エ: B(j,7-i) <- A(i,j)
print(sorted(B))
FAQ
Q1. なぜ N−1(ここでは7)を使うのですか?
A1. インデックスが0始まりなので,反転すると位置は N−1−i になります。N=8 の場合は 7−i です。
A1. インデックスが0始まりなので,反転すると位置は N−1−i になります。N=8 の場合は 7−i です。
Q2. 90度回転を見分けるコツは?
A2. 「上端の水平線 → 右端の垂直線」なら時計回り。「上端 → 左端」なら反時計回りです。
A2. 「上端の水平線 → 右端の垂直線」なら時計回り。「上端 → 左端」なら反時計回りです。
Q3. 代表点はいくつ確認すれば十分ですか?
A3. 3点(角2つ+内部の1点)くらい確認すれば回転・反転・鏡映の区別が確実です。
A3. 3点(角2つ+内部の1点)くらい確認すれば回転・反転・鏡映の区別が確実です。
関連キーワード: 配列変換、2次元配列、90度回転、座標変換、行列インデックス、ループ設計、アルゴリズム、配列操作

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

