2022 サンプル問題6テクノロジ系

基本情報 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 -正答
正答: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解説です。

テクノロジ系の他の過去問

1
テクノロジ系
2
テクノロジ系
3
テクノロジ系
4
テクノロジ系
5
テクノロジ系

あなたの弱点を診断して、合格までの最短ルートを

この分野を連続演習し、AIがあなたの弱点を分析。合格ナビなら基本情報の過去問を解きながら学べます。