基本情報 2022 サンプル問題 問6:テクノロジ系に関する問題
配列A が図2 の状態のとき,図1 の流れ図を実行すると,配列B が図3 の状態にな った。図1 のa に入れる操作はどれか。ここで,配列A,B の要素をそれぞれ A (i,j ) ,B (i,j ) とする。 終了 図1 流れ図 ループ 1 ループ 2 ループ 2 j:0,1,7(注) ループ 1 i:0,1,7(注) 開始 0 i j 1 2 3 4 5 6 7 0 1 2 4 3 5 6 7 図2 配列Aの状態 * * * * * * * ****** *** 0 i j 1 2 3 4 5 6 7 0 1 2 4 3 5 6 7 図3 実行後の配列B の状態 * * * * * * * * ***** * * * a (注)ループ端の繰返し指定は, 変数名:初期値,増分,終値 を示す。
- aB (7-i,7-j ) ← A (i,j )
- bB (7-j,i ) ← A (i,j )
- cB (i,7-j ) ← A (i,j )
- dB ( j,7-i ) ← A (i,j ) - 8 -正答
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは d「B(j, 7-i) ← A(i, j)」 です。
配列を「方眼紙の絵」だと思ってください。問題は 「絵を90度くるっと回す」 ことをしています(配列Aの星マーク模様が、配列Bでは時計回りに90度回転している)。
90度時計回りに回すと、座標がこう変わります:
- もとの (i, j) の星マークが → 新しい場所 (j, 7-i) に移動
たとえば、もとの一番上の段(i=0, j=0~7)は、回した後では一番右の列(j=0~7, 7-i=7)になります。これがちょうどdの式。
👉 覚え方: 「90度回転は (j, 7-i)」。8×8(0~7)の場合、最大値7から引くのがポイント。
ほかの選択肢は反転や別の回転になってしまい、図3の模様にならない。
なぜこれが正解か
正解は d。配列Aから配列Bへの移し替えは 時計回り90度回転 に相当する。8×8(添字0〜7)配列の座標変換は B(j, 7−i) ← A(i, j)。元の i 行目が回転後の (7−i) 列目に、j 列目が回転後の j 行目になる。
各選択肢の解説
- a `B(7−i, 7−j)`: 180度回転(点対称)。
- b `B(7−j, i)`: 反時計回り90度回転。方向が逆。
- c `B(i, 7−j)`: 左右反転。回転ではなく鏡像。
- d `B(j, 7−i)`: 時計回り90度回転 で正解。
覚え方・ひっかけ注意
N×N 配列(添字0〜N-1)の主要変換式を暗記:
- 時計回り90° = B(j, N-1-i)
- 反時計回り90° = B(N-1-j, i)
- 180° = B(N-1-i, N-1-j)
- 左右反転 = B(i, N-1-j)
試験では角の1点(例 A(0,0))を式に代入して直感と一致するか検算するのが最速。
線形代数的背景
2次元配列の回転は線形変換 + 平行移動で表現できる。原点中心の時計回り90度回転行列は:
```
[ cos(-90) -sin(-90) ] [ 0 1 ]
[ sin(-90) cos(-90) ] = [ -1 0 ]
```
配列添字は左上原点・y軸下向きの座標系を用いるため、画像処理の「上下が反転した数学座標」になる。これに N×N 配列の境界補正(添字を [0, N-1] に押し込める)として `(j, N-1-i)` が導出される。
画像処理での実装
OpenCV/PIL/NumPy では:
- NumPy: `np.rot90(A, k=-1)` で時計回り90度(k=1で反時計回り)。
- OpenCV: `cv2.rotate(A, cv2.ROTATE_90_CLOCKWISE)`。
- メモリ局所性: 行優先(row-major)配列を90度回転すると、書き込みパターンが列方向アクセスとなりキャッシュミス多発。ブロック分割回転(タイル化) で改善する。
In-place 回転アルゴリズム
本問は別配列Bを用意するが、メモリ節約のため in-place 回転 も可能:
1. 転置(transpose): A[i][j] と A[j][i] を交換 → 対角線で折り返す。
2. 各行を反転: 時計回り90度なら各行を左右反転。
計算量 O(N²) は変わらないが、空間計算量が O(1) に。実務では大画像の回転で重要。
試験での位置づけ
配列操作・流れ図問題は基本情報技術者試験の中核。本問のような幾何変換は アルゴリズム + データ構造 の融合領域。応用情報以降ではアフィン変換、同次座標、3D回転行列(SO(3))まで踏み込む。組込み系の画像処理パイプライン(カメラセンサの実装方向違いの吸収など)で頻出。
選択肢の発展補足
- 3回90度回転 = 1回反時計回り90度: 同じ回転操作を組み合わせると群構造(巡回群 ℤ/4ℤ)を成す。基本変換4種を覚えていれば任意の90度回転に対応可能。
- 任意角度の回転: バイリニア補間/バイキュービック補間が必要(整数格子に乗らないため)。逆変換(出力画素から入力画素を引く)で実装するのが定石(forward warping より aliasing が少ない)。
- GPU実装: CUDA/OpenCL では shared memory にタイルをロードして転置→書き出しで並列化。テクスチャメモリを使えばハードウェア補間も無料。
- 関連試験範囲: 行列演算(zawa-empire の AI 領域)、画像フォーマット(EXIF Orientation タグによる自動回転)、QR コードの位置検出パターン(回転不変性の利用)。
出典:IPA(情報処理推進機構)公式 基本情報技術者試験 2022 サンプル問題 問6/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。