次の処理は、昇順配列の異なる値を先頭へ詰め直す。終了後のwriteの値と、a[1]からa[write]までの値はどれか。要素番号は1から始まり、forの両端を含む。writeより後ろの値は結果に含めない。 整数型の配列: a ← {2, 2, 5, 5, 5, 9} 整数型: write ← 1 整数型: read for (read を 2 から 6 まで 1 ずつ増やす) if (a[read] ≠ a[write]) write ← write + 1 a[write] ← a[read] endif endfor
本サイトで独自に作成。IPAの試験問題からの転載ではありません。
公開日:
選択肢を選んで、答え合わせをしましょう。
回答せずに正解・解説を確認する
正解:ア write = 3、{2, 5, 9}
この表示だけでは、回答数や正答率は変わりません。
解説
readが2のときは2と2で同じなので進めません。readが3のときに5が見つかり、writeを2にしてa[2]へ5を保存します。readが4、5では5が続くので変更せず、readが6で9をa[3]へ保存します。結果の範囲は先頭3要素の{2, 5, 9}です。
異なる値が2、5、9の順で現れ、writeは1→2→3と進みます。
先頭部分は途中で上書きされます。元の配列の先頭3要素をそのまま返す処理ではありません。
5が連続している間はa[write]も5なので、2個目の5を結果へ追加しません。
ループ回数や配列長は結果の要素数と一致しません。writeは値が変わったときだけ増えます。
関連知識
readは調査位置、writeは保存済み部分の最後を表します。昇順という前提があるので同じ値は連続し、直前に保存した値との比較だけで重複を除けます。未整列の配列では離れて現れる同値をこの処理だけでは除けません。
間違えやすいポイント
配列全体が短くなったと思わないこと。要素数は変わらず、結果として使う範囲が短くなります。読み取る位置より前へ書くので、未読の値を壊さない点も確かめます。
覚え方
readで調べ、writeで結果の末尾を管理する。
実務での意味
整列済みログの連続重複をまとめる処理で、追加配列を作らず有効な先頭範囲だけを返す設計に使います。
解説:本サイト編集部によるオリジナル文章