令和8年度 科目B 問1
アルゴリズム
配列に関する問題
次のプログラム中の[ ]に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。
次のプログラムは,整数型の配列 data の末尾の要素の値を先頭の要素に移動する。この際,末尾以外の各要素の値は,一つずつ後ろの要素に移動する。
〔プログラム〕
整数型の配列: data ← {1, 2, 3, 4, 5, 6, 7, 8, 9}
整数型: top, i
整数型: len ← dataの要素数
top ← data[len]
for (i を [ ])
data[i] ← data[i - 1]
endfor
data[1] ← top- ア2 から len - 1 まで 1 ずつ増やす
- イ2 から len まで 1 ずつ増やす
- ウlen - 1 から 2 まで 1 ずつ減らす
- エlen から 2 まで 1 ずつ減らす
答えと解説を見る
✓ これが正解エlen から 2 まで 1 ずつ減らす
解説
len から 2 まで減らし、後ろの要素から写せば値を失いません。
この問は、配列の要素を一つずつ後ろへずらす繰返しの向きを決める問題です。軸になるのは、data[i] ← data[i - 1] という代入が data[i] の元の値を上書きしてしまう点です。上書きされる前にその値を次の要素へ写し終えていなければ、値が失われます。末尾の値だけは、繰返しの前に top へ退避してあります。
len から 2 まで 1 ずつ減らす形で、data ← {1, 2, 3, 4, 5, 6, 7, 8, 9} を追ってみます。len は 9、top は 9 です。i = 9 で data[9] に data[8] の 8 が入り、i = 8 で data[8] に 7 が入ります。このとき data[8] の元の 8 はすでに data[9] へ写してあるので失われません。同じように i = 2 で data[2] に 1 が入って繰返しが終わり、最後に data[1] ← top で 9 が入ります。結果は {9, 1, 2, 3, 4, 5, 6, 7, 8} となり、問題文の動作と一致します。
つまり、後ろ側の要素から順に写していく、len から 2 まで 1 ずつ減らす指定が正解です。終わりを 2 にするのは、data[1] には繰返しの後で top を入れるからで、i = 1 まで回すと data[0] という範囲外を参照してしまいます。
要素を後ろへずらすときは後ろから、前へずらすときは前から処理する、と覚えておくと、繰返しの向きを迷わずに決められます。
ほかの選択肢はなぜ違うのか
- ア2 から len - 1 まで 1 ずつ…:前から順に写すと、i = 2 で data[2] が 1 になった直後に、i = 3 でその 1 が data[3] へ写され、元の 2 は消えます。終わりが len - 1 なので data[9] も 9 のまま残り、結果は {9, 1, 1, 1, 1, 1, 1, 1, 9} です。
- イ2 から len まで 1 ずつ増やす:前から写す向きのため、data[2] から data[9] までの全部が先頭の 1 で埋まってしまいます。最後に退避した 9 を data[1] に入れても {9, 1, 1, 1, 1, 1, 1, 1, 1} となり、2 から 8 までの値が消えます。
- ウlen - 1 から 2 まで 1 ずつ…:減らしていく向きは合っていますが、始まりが len - 1 なので、data[9] に data[8] の 8 を写す回が抜けます。data[9] には元の 9 が残り、結果は {9, 1, 2, 3, 4, 5, 6, 7, 9} となって 8 がなくなります。
出典:令和8年度 基本情報技術者試験 科目B 問1
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)