基本情報

基本情報 平成23年度 秋期 問7|テクノロジ系に関する問題

問題

基本情報 | 平成23年度 秋期 | 分野:テクノロジ系

要素番号が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の単語表再構成の流れ図(開始→TANGO[n]→TANGO[0]→ループ(i:n-1,-1,0)→a→ループ→終了)(出典: 平成23年度秋期 基本情報技術者試験 午前 問7・IPA)

図の出典:出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成23年度秋期 午前 問7

キーボード:1〜4で選択・Enterで次へ

タップするとすぐ答え合わせ

答え合わせ

正解は A
  • A
  • B
  • C
  • D

自信の3択

えらぶと、この端末に記録します(登録はいりません)

解説

答えは a「TANGO[i] → TANGO[i+1]」 です。

流れ図の「X → Y」は「Xの値をYに入れる」という意味。最初に n 番目の単語を空いている TANGO[0] に避難させ、i を n-1 から 0 まで1ずつ減らしながら、TANGO[i] の単語を一つ後ろの TANGO[i+1] に移します。最後の i=0 で、避難させておいた単語が TANGO[1] に入って完成です。

👉 覚え方:後ろにずらすときは「後ろから順に」コピーする。前からやると、まだ移していない単語を上書きして消してしまう。

ほかの選択肢:b・c・d はどれも n-i という番号が入り、単語が一つ後ろではなく別の位置に移ってしまう。

なぜこれが正解か

正解は a。流れ図の「X → Y」はXの値をYに代入する意味。処理は次の2段階になっている。

1. TANGO[n] → TANGO[0]:n番目の単語を、使っていない0番に退避する。

2. i を n-1 から 0 まで1ずつ減らしながら、空欄 a の処理で単語を一つ後ろへ移す。

a に TANGO[i] → TANGO[i+1] を入れ、n=3(TANGO[1]〜[3] が A,B,C)で確かめる。退避で TANGO[0]=C。i=2 で TANGO[3]=B、i=1 で TANGO[2]=A、i=0 で TANGO[1]=C となり、C,A,B と並ぶ。n番目の単語が先頭に来て、残りが一つずつ後ろにずれている。

各選択肢の解説(n=3、A,B,C で確認)

  • a:上のとおり C,A,B になる(正解)。
  • b:TANGO[i] → TANGO[n-i] は、i=2 で TANGO[1] に B を入れて A を消してしまう。結果は B,B,C。
  • c:TANGO[i+1] → TANGO[n-i] は、i=2 で TANGO[1] に C、i=0 で TANGO[3] に TANGO[1](=C)を入れる。結果は C,B,C。
  • d:TANGO[n-i] → TANGO[i] は、i=2 で TANGO[2] に A、i=1 で TANGO[1] に A、i=0 で TANGO[0] を上書きする。結果は A,A,C。

覚え方・ひっかけ注意

配列を後ろにずらすときは後ろから順に代入するのが鉄則。前から代入すると、まだ移していない値を上書きして失う。流れ図の問題は、n=3 など小さな値で変数の値を表に書いて追う(トレース)と確実。

理論的背景

この処理は TANGO[1]〜TANGO[n] を右へ1つ循環シフト(ローテーション)する操作で、要素の移動回数は n 回、計算量は O(n)。追加の記憶領域は退避用の1要素(ここでは未使用の TANGO[0])だけで済む。ループの不変条件を「i の処理を終えた時点で、TANGO[i+1]〜TANGO[n] には元の TANGO[i]〜TANGO[n-1] が入っている」と置くと、i を1ずつ減らしても条件が保たれ、i=0 の処理で退避値が TANGO[1] に入って全体が正しく並ぶことを帰納的に示せる。k 個ずつずらす一般の循環シフトでは、k 個を退避する方法のほか、区間を3回反転する方法(前半と後半をそれぞれ反転し、最後に全体を反転)で O(n) 時間・O(1) 領域を実現できる。

実務での使われ方

挿入ソートで「挿入位置まで要素を後ろへずらす」処理は本問と同じ形。C言語の memmove が重なり合う領域を安全にコピーできるのも、重なり方に応じてコピーの向き(前から/後ろから)を切り替えているから。リングバッファ(音声・通信のバッファ)は先頭位置を示す添字だけを動かし、データ本体を移動しないことでシフトのコストをなくしている。

試験での位置づけ

基本情報では、配列の要素を移動・挿入・削除する流れ図や擬似言語の穴埋めが繰り返し出題される。ループの初期値・増分・終値と代入の向きの組合せで選択肢を作るのが定番なので、小さな n で全選択肢をトレースするのが最速で確実。

選択肢の発展補足

b〜d のように添字に n-i を使うと、i の減少に合わせて代入先が配列の反対側から近づいてくるため、配列を反転するときの形に近くなる(反転なら TANGO[i] と TANGO[n+1-i] を交換する)。作りたいのがシフトなのか反転なのかを添字の動き方で見分けられるようにしておくと、穴埋め問題で迷わない。また、ループを前向き(i を増やす)に回す場合は、代入の向きを逆にして前へ詰める(削除の処理)形になる点も対で覚えておくとよい。

この問題の根拠出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成23年度 秋期 問7
訂正の記録この問題の訂正はありません(サイト全体の記録)
出典と作り方

出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成23年度 秋期 問7/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビ独自の3段階の解説(初級・標準・上級)です。