09 過去問演習ー6(総仕上げ・残り全部)

1〜5周目で出していない残り全部。全9問。

スタック問1 ★逆ポーランド記法

過去問(スタック)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2023-06-11 問3〕
解説を表示

正解:ウ

逆ポーランド表記法(後置表記法)は、演算子を2つの数の「後ろ」に書くルールです。ふだん A+B と書くところを AB+ と書きます。カッコがいらないのが最大の利点で、コンピュータが式を計算するときに使われます。

読み解くコツはスタック(積み上げ式のメモ)を使うことです。手順はたった2つ。

順番を間違えやすいので注意です。取り出した2つのうち、後から積んだ方(上)が演算子の右側にきます。AB−A−B であって B−A ではありません。

トレース表

与えられた式 EF−G÷CD−AB+÷+ を左から1文字ずつ処理します。

手順読む文字やること処理後のスタック(左が下)
1E積むE
2F積むE, F
3E と F を取り出し (E−F) を積む(E−F)
4G積む(E−F), G
5÷(E−F) と G を取り出し ((E−F)÷G) を積む((E−F)÷G)
6C積む((E−F)÷G), C
7D積む((E−F)÷G), C, D
8C と D を取り出し (C−D) を積む((E−F)÷G), (C−D)
9A積む((E−F)÷G), (C−D), A
10B積む((E−F)÷G), (C−D), A, B
11+A と B を取り出し (A+B) を積む((E−F)÷G), (C−D), (A+B)
12÷(C−D) と (A+B) を取り出し ((C−D)÷(A+B)) を積む((E−F)÷G), ((C−D)÷(A+B))
13+残り2つを取り出してたす((E−F)÷G)+((C−D)÷(A+B))

最後にスタックに残った1つの塊が答えの式です。これは選択肢とぴったり一致します。

なぜ他の選択肢が違うのか

速解法

4択なら全部トレースしなくても、次の2段構えでほぼ一撃です。

  1. 最後の1文字を見る:与式の末尾は「+」。=一番外側の演算は足し算。→ 外側が「−」のアと、外側が「÷」のエが即消える。
  2. 先頭の3文字を見る:与式は EF− で始まる。=最初のかたまりは (E−F)。残ったイとウのうち、(E−F) を先に作っているのはだけ(イは (E−F) が最後に足される位置にある)。

末尾の演算子=一番外側」は逆ポーランドの問題でくり返し使える強力な武器なので、必ず覚えておきましょう。

スタック問2 ★計算式と後置記法の対応

過去問(スタック)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2023-07-23 問3〕
解説を表示

正解:エ

今度は「ふつうの式(中置表記)」と「逆ポーランド表記法(後置表記)」の組合せが正しいものを選ぶ問題です。4つの表を1つずつ照合します。

ふつうの式を後置に直す手順は、カッコの内側から順に、演算子をそのかたまりの後ろへ回すだけです。

選択肢ごとの検証

示された計算式正しい後置表記示された後置表記判定
((a+b)*c)−dab+c*d−abc*+d−×
(a+(b*c))−dabc*+d−ab+c*d−×
(a+b)*(c−d)ab+cd−*abc*d−+×
a+(b*(c−d))abcd−*+abcd−*+

エが正しいことの確認(途中式)

計算式 a+(b*(c−d)) を内側から変換します。

  1. 一番内側の (c−d)cd−
  2. 次に b*(c−d)bcd− のかけ算なので、2つを並べて後ろに *b cd− *bcd−*
  3. 最後に a+(…)abcd−* の足し算なので、後ろに +a bcd−* +abcd−*+

示された abcd−*+ と完全一致します。

念のため逆方向(後置 → ふつうの式)でも検算しておきます。abcd−*+ をスタックでたどると…

読む文字処理後のスタック
a, b, c, da, b, c, d
a, b, (c−d)
*a, (b*(c−d))
+a+(b*(c−d))

示された計算式と同じになりました。

なぜ他の選択肢が違うのか

速解法

4つ全部を変換すると時間がかかります。「末尾の演算子=一番外側の演算」だけを見て高速にふるいにかけましょう。

計算式の外側の演算後置表記の末尾一致?
一致(ここでは切れない)
一致(ここでは切れない)
*+不一致 → 即×
++一致

ウはこれで一瞬で消えます。残るア・イ・エは、次に「先頭の3文字」を見るのがコツです。

つまり「末尾=一番外側」「先頭のかたまり=一番内側(最初に計算する所)」の2点チェックで、変換作業をほとんどせずに答えが出せます。この2つはセットで覚えてください。

アルゴリズム問3 ★再帰呼出しの説明

過去問(アルゴリズム)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2020-06-14 問9〕
解説を表示

正解:イ

問われているのは「再帰呼出し(さいきよびだし)」という言葉の意味です。答えは単純で、ある関数が、その処理の中で自分自身を呼び出すこと。これがそのまま述べられているのが選択肢イです。

イメージで理解する

他の選択肢が何の説明なのか(用語のすり替えを見抜く)

選択肢説明されているもの再帰と何が違うか
イベント駆動(イベントドリブン)ボタンが押された等の「出来事」をきっかけに処理を選ぶ話。関数が自分を呼ぶ話ではありません。
常駐(メモリに残して再利用する仕組み。再入可能/再使用可能などの「再〜」系用語)終わった処理をメモリに残す話であって、自分自身を呼ぶこととは無関係。
ロールバック(失敗時に元の状態へ戻す、データベース等の仕組み)異常時の復旧の話。処理の呼び出し方の話ではありません。

速解法

流れ図問4 ★最も右の1のビットだけを残す

過去問(流れ図)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2021-07-25 問1〕
解説を表示

正解:ウ

この問題は「ビット列の中でいちばん右にある1だけを残して、あとは全部0にする」という有名なテクニックを、穴埋めで確認するものです。手順1で B = A - 1、手順2で C = A XOR B を作り、手順3で A と C を何かの演算にかけて答えを得ます。

まず「1を引く」と何が起こるか

2進数から1を引くと、右端から見ていって最初に現れる1が0に変わり、それより右にあった0はすべて1に変わります(そこより左は変化しません)。筆算の繰り下がりを思い出すとイメージしやすいです。

ビット列説明
A00101000右から4桁目に「最も右の1」がある
B = A - 100100111その1が0になり、右側の000が111になった

次に XOR をとる

XOR(排他的論理和)は「2つのビットが違えば1、同じなら0」です。A と B は左の部分が完全に同じで、右の部分(最も右の1とそれ以下)だけが全部反転しています。だから XOR をとると、変化した部分だけが1になります。

ビット列
A00101000
B00100111
C = A XOR B00001111

C は「最も右の1の位置から下が全部1、それより上は0」というマスク(型抜きの型紙)になりました。

最後の手順3で欲しいもの

求める答えは 00001000。A のうち「最も右の1」だけを残したいので、C という型紙で A を切り抜くイメージです。「両方が1のところだけ1」=論理積(AND)を使います。

ビット列
A00101000
C00001111
A AND C00001000

期待どおり 00001000 になりました。よって a に入るのは論理積(AND)=ウです。

なぜ他の選択肢ではダメか

速解法

流れ図問5 ★2つの流れ図が等価になる条件

過去問(流れ図)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2022-06-12 問10〕
解説を表示

正解:ウ

左右2つの流れ図が、正の整数 M に対して同じ x を出すようにしたいという問題です。まず、それぞれが何を計算しているのかを読み取ります。

左の流れ図(ループ端を使った書き方)

x を1にしてから、n を「初期値 M、増分 −1、終値 1」で回して、毎回 x ← x × n をします。つまり n は M, M−1, …, 2, 1 と減っていき、x にはそれらが全部かけられます。結果は

x = M × (M−1) × … × 2 × 1、すなわち M の階乗(M!)です。かける順番は結果に影響しないので、要するに1からMまでの全部の掛け算だと思えばOKです。

右の流れ図(判断で終わりを決める書き方)

x を1、n を1にしてから、次の3つを繰り返します。

  1. x ← x × n(今の n をかける)
  2. n ← n + 1(n を1増やす)
  3. 条件 a を判定し、Yes なら終了、No ならループの先頭に戻る

ここでの最大のポイントは、判定が「n を増やした後」に行われることです。「今かけ終わった数」と「今の n の値」が1ずれているので、そこを取り違えると答えが1つずれます。

トレース表で確かめる(M = 3 の場合、正解は 3! = 6)

周回x ← x × n の後の xn ← n+1 の後の nここで終わってほしい?
1周目1 × 1 = 12いいえ(まだ2,3をかけていない)
2周目1 × 2 = 23いいえ(まだ3をかけていない)
3周目2 × 3 = 64はい(6 = 3! が完成)

表の右端を見ると、終わりたいのは n が 4 のときだけ、つまり n が M(=3) より大きくなった瞬間です。n が 2 や 3 のときは終わってはいけません。この「n = 4 のときだけ Yes、n = 2, 3 では No」をぴったり満たす条件が n > M =ウです。

なぜ他の選択肢が違うか(M = 3 で確認)

ちなみに M = 1 でも確認できます。左は x = 1。右はウの条件なら、1周目で x = 1 × 1 = 1、n = 2 となり 2 > 1 で Yes → x = 1 で一致します。

速解法

流れ図問6 ★反復して収束したときの関係式

過去問(流れ図)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2024-12-08 問4〕
解説を表示

正解:エ

①〜⑤の手続きを、まず日本語で読み解きます。

  1. x に最初の値 a を入れる
  2. y に f(x) の結果を入れる(今の x を関数に通す)
  3. y を表示する
  4. x に y を入れる(出てきた答えを、次の入力にする
  5. ②に戻る

つまりこれは、関数の出力をそのまま次の入力に入れ直すことを、②〜⑤で延々と繰り返す手続きです。電卓で「ある数にボタンを押す → 出た数にまた同じボタンを押す」を続けるのと同じイメージです。

値の流れを表で追う

周回②に入るときの x②で決まる y③で表示される値
1周目af(a)f(a)
2周目f(a)f(f(a))f(f(a))
3周目f(f(a))f(f(f(a)))f(f(f(a)))

x は「1つ前に表示された y」であり、y は「その x を f に通した値」です。この2つの関係だけを押さえれば十分です。

「y が変化しなくなった」を式にする

問題は、十分に繰り返した後で③に表示される y が変わらなくなった状態を考えています。y が変わらないということは、④で x ← y をしても x の値が前回と同じになり、その x から作られる次の y も同じ、という状態です。そこで、落ち着いた状態の値をあらためて y とすると、

この2つの x を同じものとしてつなぐと、y = f(x) = f(y)。したがって f(y) = y =エが成り立ちます。

言い換えると、「f に通しても値が変わらない数」に行き着いた、ということです(このような値を不動点といいます)。もし f(y) が y と違う値なら、次の周で表示が変わってしまい「変化がなくなった」という前提に反します。

なぜ他の選択肢が違うか

速解法

探索問7 ★ハッシュ法の説明

過去問(探索)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2020-06-14 問18〕
解説を表示

正解:エ

「理想的なハッシュ法とはどういう検索のしくみか」を選ぶ、用語の意味を知っているかどうかの問題です。計算はいりません。

ハッシュ法とは何か(ここだけ覚えれば解ける)

ハッシュ法は、データそのものを計算式(ハッシュ関数)に通して数を出し、その数をしまう場所の住所(アドレス)として使う方法です。たとえば「学生番号を 100 で割った余りの番号のロッカーに入れる」と決めておけば、探すときも同じ計算をするだけで、そのロッカーを 1 回開ければ見つかります。

選択肢 エ は「データを決まった計算で変換した値を、しまう場所の住所として使う、速くてデータが増えても強い検索方法」という内容で、上の説明とぴったり一致します。よって

なぜ他の選択肢が違うのか

選択肢説明されている中身ハッシュ法との違い
同じ意味の言葉・似た言葉の一覧(シソーラス/同義語辞書)を使い、言い方が違っても検索に引っかかるようにする技術これは全文検索の言葉の話。「探し漏れを減らす」のが目的で、しまう場所を計算する話ではない
大量のデータを分析して、傾向や関係性・パターンを見つけ出す手法これはデータマイニング。目的が「新しい知識を発見すること」で、そもそも検索の高速化ではない
データと処理をひとまとめにしたオブジェクトに判断機能を持たせ、利用者の意図をくみ取る高度な検索オブジェクト指向・知的検索の話。ハッシュ法は単純な計算式で場所を決めるだけで、意図の判断など一切しない

速解法

選択肢の中に「アドレス(格納アドレス)を求める・使う」という言葉があるかを真っ先に探してください。ハッシュ法の本質は「計算 → 住所」なので、この 2 語がそろっている選択肢がほぼ答えです。ア・イ・ウのように「同義語」「傾向・パターン」「オブジェクト」といった言葉が主役になっているものは、別の用語(シソーラス/データマイニング/オブジェクト指向)の説明だと判断して切り捨てられます。

探索問8 ★ハッシュ値と衝突

過去問(探索)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2022-01-23 問8〕
解説を表示

正解:イ

まず用語の確認から。ハッシュ値とは、データ(ここでは3文字のキー)を決まった計算式にかけて出す「格納場所の番号」のことです。そして衝突(コリジョン)とは、別のキーなのにハッシュ値が同じになってしまうことを指します。つまりこの問題は、「SEP と同じ計算結果になるものを選べ」と言っているだけです。

計算式は「3文字それぞれのアルファベット順の番号(A=1, B=2, …, Z=26)を足し算し、その合計を 27 で割った余り」。それ以上でも以下でもありません。

まず基準となる SEP を計算する

選択肢を全部計算して比べる

キー各文字の番号合計27 で割った余りSEP(13)と同じ?
ア APRA=1, P=16, R=183535 − 27 = 8×
イ FEBF=6, E=5, B=21313(27 より小さいのでそのまま)= 13○ 一致
ウ JANJ=10, A=1, N=142525×
エ NOVN=14, O=15, V=225151 − 27 = 24×

SEP と同じ 13 になるのは FEB だけ。キーは違うのに置き場所が同じ 13 番になってしまう、まさに衝突です。よってが正解。

なぜ他の選択肢が違うのか(どれも計算結果が 13 にならない、それだけです)

速解法

探索問9 ★ハッシュ法の説明(別問)

過去問(探索)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2023-07-23 問15〕
解説を表示

正解:ア

これも「ハッシュ法とはどんなアクセス方法か」を選ぶ用語問題です。前問(2020年 問18)とほぼ同じ知識で解けますが、選択肢がどれもファイルのアクセス方法で似ているぶん、区別する力が試されます。

考え方

ハッシュ法は「キー値(データを見分ける番号や名前)を関数(計算式)に入れて、しまってある場所の住所を計算で出す」方法です。ポイントは 2 つ。

選択肢 ア はまさに「関数を使ってキー値から格納アドレスを求めてアクセスする」という内容なので、そのまま正解です。よって

なぜ他の選択肢が違うのか(似ている 3 つを見分ける)

選択肢説明されている中身正体ハッシュ法との決定的な違い
各データが「次のデータの住所」を持っていて、それをたどっていくリスト(連結リスト)/ポインタによるアクセス計算ではなく矢印を順にたどる。先頭から順に追うので、遠くのデータほど時間がかかる
キー値と格納アドレスの対応表を用意しておき、それを引いて場所を知る索引(インデックス)による アクセスハッシュ法は表を持たない。その場で計算するから表がいらない、というのが売り。ここが最大のひっかけ
キー値をそのまま格納アドレスとして使う直接アクセス法関数を通していない。キー値が学生番号 20230001 のような大きな数だと、その番号の分だけ場所を用意することになり現実的でない。だから関数で小さい数に変換するのがハッシュ法

特に は要注意です。ウは「表を引く」、エは「計算しない」。ハッシュ法は「表を引かずに、計算して住所を出す」——この一言で 3 つとも切れます。

速解法

  1. 選択肢に「関数」という言葉があるか探す → ハッシュ法の説明には必ず入る。
  2. その関数が「キー値 → 格納アドレス」の向きになっているか確認する。
  3. 「次のレコードの住所」=リスト、「対応表」=索引、「キー値をそのまま」=直接アクセス、と正体を言い当てて消す。

ハッシュ法・リスト・索引・直接アクセスの 4 点セットはこの形で繰り返し出題されるので、上の表ごと覚えてしまうのが最短です。


【練習リンク】