平成23年度 秋期 午前 問7
アルゴリズム
配列に関する問題
要素番号が0から始まる配列 TANGO がある。n 個の単語が TANGO[1] から TANGO[n] に入っている。図は,n 番目の単語を TANGO[1] に移動するために,TANGO[1] から TANGO[n−1] の単語を順に一つずつ後ろにずらして単語表を再構成する流れ図である。a に入れる処理として,適切なものはどれか。
〔流れ図〕
( 開始 )
│
〔 TANGO[n] → TANGO[0] 〕
│
⌈ ループ ⌉
⌊ i : n−1, −1, 0 ⌋
│
[ a ]
│
⌈ ループ ⌉
│
( 終了 )
(注)ループにおける条件は,
変数名:初期値,増分,終値
を示す。- アTANGO[i] → TANGO[i+1]
- イTANGO[i] → TANGO[n−i]
- ウTANGO[i+1] → TANGO[n−i]
- エTANGO[n−i] → TANGO[i]
答えと解説を見る
✓ これが正解アTANGO[i] → TANGO[i+1]
解説
後ろ側から順に、自分の値を一つ後ろへ写します。
この流れ図は、まず末尾の単語を配列の0番へ待避しています。0番には単語が入っていないので、作業用の置き場として使えます。次にループが、添字を末尾の一つ手前から1ずつ減らしながら0まで回ります。ここで行いたいのは、前に詰まっている単語を一つずつ後ろへ送る作業です。上書きで値を失わないためには、後ろ側から先に送らなければなりません。添字が大きいほうから始まっているのはそのためです。ループが0まで下りてくると、待避してあった末尾の単語が先頭へ入り、求める並びが出来上がります。判定の軸は二つです。写す元と写す先が隣り合っているか、そして写す先が元より後ろ側になっているかです。この二つが満たされていれば、添字が減るにつれて単語が一つずつ後ろへずれ、最後の一回で待避した値が先頭へ収まります。
ほかの選択肢はなぜ違うのか
- イTANGO[i] → TANGO[n−i…:写す先が、添字から素直に決まる位置ではなく、末尾から数え返した位置になっています。添字が減ると元は前へ動くのに先は後ろへ動くため、隣どうしでずらす関係になりません。
- ウTANGO[i+1] → TANGO[n…:写す元が添字の一つ後ろ、写す先は末尾から数え返した位置なので、両者の間隔が回るたびに変わります。最初の回で末尾の単語を先頭へ入れたあと、最後の回では逆に先頭の値を末尾へ書き戻してしまい、間の単語が一つずつ後ろへずれないまま並びが崩れます。
- エTANGO[n−i] → TANGO[i…:写す元は末尾から数え返した位置、写す先は添字の位置なので、回るたびに両者の間隔が変わり、隣どうしでずらす関係になりません。これでは前の単語を後ろへ送れず、離れた位置どうしを上書きしていくだけになります。
出典:平成23年度 秋期 基本情報技術者試験 午前 問7(改変:原典の図表をテキストに書き起こした)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)