正解:ウ
逆ポーランド表記法(後置表記法)は、演算子を2つの数の「後ろ」に書くルールです。ふだん A+B と書くところを AB+ と書きます。カッコがいらないのが最大の利点で、コンピュータが式を計算するときに使われます。
読み解くコツはスタック(積み上げ式のメモ)を使うことです。手順はたった2つ。
順番を間違えやすいので注意です。取り出した2つのうち、後から積んだ方(上)が演算子の右側にきます。AB− は A−B であって B−A ではありません。
与えられた式 EF−G÷CD−AB+÷+ を左から1文字ずつ処理します。
| 手順 | 読む文字 | やること | 処理後のスタック(左が下) |
|---|---|---|---|
| 1 | E | 積む | E |
| 2 | F | 積む | E, F |
| 3 | − | E と F を取り出し (E−F) を積む | (E−F) |
| 4 | G | 積む | (E−F), G |
| 5 | ÷ | (E−F) と G を取り出し ((E−F)÷G) を積む | ((E−F)÷G) |
| 6 | C | 積む | ((E−F)÷G), C |
| 7 | D | 積む | ((E−F)÷G), C, D |
| 8 | − | C と D を取り出し (C−D) を積む | ((E−F)÷G), (C−D) |
| 9 | A | 積む | ((E−F)÷G), (C−D), A |
| 10 | B | 積む | ((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つの塊が答えの式です。これは選択肢ウとぴったり一致します。
AB+CD−÷G+EF−÷ のようになり、先頭の並び EF− すら合いません。与えられた式は「E F −」で始まるので、最初に計算されるのは E−F のはずですが、イでは E−F は最後の方にしか出てきません。4択なら全部トレースしなくても、次の2段構えでほぼ一撃です。
EF− で始まる。=最初のかたまりは (E−F)。残ったイとウのうち、(E−F) を先に作っているのはウだけ(イは (E−F) が最後に足される位置にある)。「末尾の演算子=一番外側」は逆ポーランドの問題でくり返し使える強力な武器なので、必ず覚えておきましょう。
正解:エ
今度は「ふつうの式(中置表記)」と「逆ポーランド表記法(後置表記)」の組合せが正しいものを選ぶ問題です。4つの表を1つずつ照合します。
ふつうの式を後置に直す手順は、カッコの内側から順に、演算子をそのかたまりの後ろへ回すだけです。
| 示された計算式 | 正しい後置表記 | 示された後置表記 | 判定 | |
|---|---|---|---|---|
| ア | ((a+b)*c)−d | ab+c*d− | abc*+d− | × |
| イ | (a+(b*c))−d | abc*+d− | ab+c*d− | × |
| ウ | (a+b)*(c−d) | ab+cd−* | abc*d−+ | × |
| エ | a+(b*(c−d)) | abcd−*+ | abcd−*+ | ○ |
計算式 a+(b*(c−d)) を内側から変換します。
(c−d) → cd−b*(c−d)。b と cd− のかけ算なので、2つを並べて後ろに * → b cd− * = bcd−*a+(…)。a と bcd−* の足し算なので、後ろに + → a bcd−* + = abcd−*+示された abcd−*+ と完全一致します。
念のため逆方向(後置 → ふつうの式)でも検算しておきます。abcd−*+ をスタックでたどると…
| 読む文字 | 処理後のスタック |
|---|---|
| a, b, c, d | a, b, c, d |
| − | a, b, (c−d) |
| * | a, (b*(c−d)) |
| + | a+(b*(c−d)) |
示された計算式と同じになりました。
abc*+d− は、b*c を先に作ってから a を足し、最後に d を引く並びなので、実はイの計算式 (a+(b*c))−d のものです。逆にイの後置表記 ab+c*d− は、a+b を先に作ってから c をかけ、最後に d を引くのでアの計算式 ((a+b)*c)−d のものです。ペアが交換されているだけの、ひっかけ選択肢です。ab+cd−*(末尾が *)。ところが示された後置表記は abc*d−+ で末尾が + = 一番外側がかけ算ではなく足し算。この時点で不一致です(abc*d−+ をたどると a+((b*c)−d) という別の式になります)。4つ全部を変換すると時間がかかります。「末尾の演算子=一番外側の演算」だけを見て高速にふるいにかけましょう。
| 計算式の外側の演算 | 後置表記の末尾 | 一致? | |
|---|---|---|---|
| ア | − | − | 一致(ここでは切れない) |
| イ | − | − | 一致(ここでは切れない) |
| ウ | * | + | 不一致 → 即× |
| エ | + | + | 一致 |
ウはこれで一瞬で消えます。残るア・イ・エは、次に「先頭の3文字」を見るのがコツです。
abc*… は「最初に b*c を作る」意味 → でもアの計算式は最初に a+b を作るはず → ×ab+… は「最初に a+b を作る」意味 → でもイの計算式は最初に b*c を作るはず → ×abcd−… は「最初に c−d を作る」意味 → エの計算式も一番内側は (c−d) → ○つまり「末尾=一番外側」「先頭のかたまり=一番内側(最初に計算する所)」の2点チェックで、変換作業をほとんどせずに答えが出せます。この2つはセットで覚えてください。
正解:イ
問われているのは「再帰呼出し(さいきよびだし)」という言葉の意味です。答えは単純で、ある関数が、その処理の中で自分自身を呼び出すこと。これがそのまま述べられているのが選択肢イです。
イメージで理解する
fact(n) を「n × fact(n−1)」と定義し、n = 1 になったら 1 を返して止める、という書き方。他の選択肢が何の説明なのか(用語のすり替えを見抜く)
| 選択肢 | 説明されているもの | 再帰と何が違うか |
|---|---|---|
| ア | イベント駆動(イベントドリブン) | ボタンが押された等の「出来事」をきっかけに処理を選ぶ話。関数が自分を呼ぶ話ではありません。 |
| ウ | 常駐(メモリに残して再利用する仕組み。再入可能/再使用可能などの「再〜」系用語) | 終わった処理をメモリに残す話であって、自分自身を呼ぶこととは無関係。 |
| エ | ロールバック(失敗時に元の状態へ戻す、データベース等の仕組み) | 異常時の復旧の話。処理の呼び出し方の話ではありません。 |
速解法
正解:ウ
この問題は「ビット列の中でいちばん右にある1だけを残して、あとは全部0にする」という有名なテクニックを、穴埋めで確認するものです。手順1で B = A - 1、手順2で C = A XOR B を作り、手順3で A と C を何かの演算にかけて答えを得ます。
まず「1を引く」と何が起こるか
2進数から1を引くと、右端から見ていって最初に現れる1が0に変わり、それより右にあった0はすべて1に変わります(そこより左は変化しません)。筆算の繰り下がりを思い出すとイメージしやすいです。
| ビット列 | 説明 | |
|---|---|---|
A | 00101000 | 右から4桁目に「最も右の1」がある |
B = A - 1 | 00100111 | その1が0になり、右側の000が111になった |
次に XOR をとる
XOR(排他的論理和)は「2つのビットが違えば1、同じなら0」です。A と B は左の部分が完全に同じで、右の部分(最も右の1とそれ以下)だけが全部反転しています。だから XOR をとると、変化した部分だけが1になります。
| ビット列 | |
|---|---|
A | 00101000 |
B | 00100111 |
C = A XOR B | 00001111 |
C は「最も右の1の位置から下が全部1、それより上は0」というマスク(型抜きの型紙)になりました。
最後の手順3で欲しいもの
求める答えは 00001000。A のうち「最も右の1」だけを残したいので、C という型紙で A を切り抜くイメージです。「両方が1のところだけ1」=論理積(AND)を使います。
| ビット列 | |
|---|---|
A | 00101000 |
C | 00001111 |
A AND C | 00001000 |
期待どおり 00001000 になりました。よって a に入るのは論理積(AND)=ウです。
なぜ他の選択肢ではダメか
00101000 XOR 00001111 = 00100111。これは B と同じ値で、1が複数残ってしまいます。11110111。0だらけにしたいのに、逆に1だらけになります。00101000 OR 00001111 = 00101111。1が増えるだけで、消したいビットが消えません。速解法
A AND (-A) という1行で書けます。この問題の手順は、それと同じ結果を XOR とマスクで作っているだけです。
正解:ウ
左右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つを繰り返します。
x ← x × n(今の n をかける)n ← n + 1(n を1増やす)ここでの最大のポイントは、判定が「n を増やした後」に行われることです。「今かけ終わった数」と「今の n の値」が1ずれているので、そこを取り違えると答えが1つずれます。
トレース表で確かめる(M = 3 の場合、正解は 3! = 6)
| 周回 | x ← x × n の後の x | n ← n+1 の後の n | ここで終わってほしい? |
|---|---|---|---|
| 1周目 | 1 × 1 = 1 | 2 | いいえ(まだ2,3をかけていない) |
| 2周目 | 1 × 2 = 2 | 3 | いいえ(まだ3をかけていない) |
| 3周目 | 2 × 3 = 6 | 4 | はい(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 で一致します。
速解法
正解:エ
①〜⑤の手続きを、まず日本語で読み解きます。
つまりこれは、関数の出力をそのまま次の入力に入れ直すことを、②〜⑤で延々と繰り返す手続きです。電卓で「ある数にボタンを押す → 出た数にまた同じボタンを押す」を続けるのと同じイメージです。
値の流れを表で追う
| 周回 | ②に入るときの x | ②で決まる y | ③で表示される値 |
|---|---|---|---|
| 1周目 | a | f(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 と違う値なら、次の周で表示が変わってしまい「変化がなくなった」という前提に反します。
なぜ他の選択肢が違うか
速解法
f(x) = (x + 2 ÷ x) ÷ 2(√2 を求める計算)で a = 1 から試すと、1 → 1.5 → 1.4166… → 1.41421… と落ち着き、その値は f に通しても変わりません。まさに f(y) = y の状態です。
正解:エ
「理想的なハッシュ法とはどういう検索のしくみか」を選ぶ、用語の意味を知っているかどうかの問題です。計算はいりません。
ハッシュ法とは何か(ここだけ覚えれば解ける)
ハッシュ法は、データそのものを計算式(ハッシュ関数)に通して数を出し、その数をしまう場所の住所(アドレス)として使う方法です。たとえば「学生番号を 100 で割った余りの番号のロッカーに入れる」と決めておけば、探すときも同じ計算をするだけで、そのロッカーを 1 回開ければ見つかります。
選択肢 エ は「データを決まった計算で変換した値を、しまう場所の住所として使う、速くてデータが増えても強い検索方法」という内容で、上の説明とぴったり一致します。よって エ。
なぜ他の選択肢が違うのか
| 選択肢 | 説明されている中身 | ハッシュ法との違い |
|---|---|---|
| ア | 同じ意味の言葉・似た言葉の一覧(シソーラス/同義語辞書)を使い、言い方が違っても検索に引っかかるようにする技術 | これは全文検索の言葉の話。「探し漏れを減らす」のが目的で、しまう場所を計算する話ではない |
| イ | 大量のデータを分析して、傾向や関係性・パターンを見つけ出す手法 | これはデータマイニング。目的が「新しい知識を発見すること」で、そもそも検索の高速化ではない |
| ウ | データと処理をひとまとめにしたオブジェクトに判断機能を持たせ、利用者の意図をくみ取る高度な検索 | オブジェクト指向・知的検索の話。ハッシュ法は単純な計算式で場所を決めるだけで、意図の判断など一切しない |
速解法
選択肢の中に「アドレス(格納アドレス)を求める・使う」という言葉があるかを真っ先に探してください。ハッシュ法の本質は「計算 → 住所」なので、この 2 語がそろっている選択肢がほぼ答えです。ア・イ・ウのように「同義語」「傾向・パターン」「オブジェクト」といった言葉が主役になっているものは、別の用語(シソーラス/データマイニング/オブジェクト指向)の説明だと判断して切り捨てられます。
正解:イ
まず用語の確認から。ハッシュ値とは、データ(ここでは3文字のキー)を決まった計算式にかけて出す「格納場所の番号」のことです。そして衝突(コリジョン)とは、別のキーなのにハッシュ値が同じになってしまうことを指します。つまりこの問題は、「SEP と同じ計算結果になるものを選べ」と言っているだけです。
計算式は「3文字それぞれのアルファベット順の番号(A=1, B=2, …, Z=26)を足し算し、その合計を 27 で割った余り」。それ以上でも以下でもありません。
まず基準となる SEP を計算する
選択肢を全部計算して比べる
| キー | 各文字の番号 | 合計 | 27 で割った余り | SEP(13)と同じ? |
|---|---|---|---|---|
| ア APR | A=1, P=16, R=18 | 35 | 35 − 27 = 8 | × |
| イ FEB | F=6, E=5, B=2 | 13 | 13(27 より小さいのでそのまま)= 13 | ○ 一致 |
| ウ JAN | J=10, A=1, N=14 | 25 | 25 | × |
| エ NOV | N=14, O=15, V=22 | 51 | 51 − 27 = 24 | × |
SEP と同じ 13 になるのは FEB だけ。キーは違うのに置き場所が同じ 13 番になってしまう、まさに衝突です。よってイが正解。
なぜ他の選択肢が違うのか(どれも計算結果が 13 にならない、それだけです)
速解法
正解:ア
これも「ハッシュ法とはどんなアクセス方法か」を選ぶ用語問題です。前問(2020年 問18)とほぼ同じ知識で解けますが、選択肢がどれもファイルのアクセス方法で似ているぶん、区別する力が試されます。
考え方
ハッシュ法は「キー値(データを見分ける番号や名前)を関数(計算式)に入れて、しまってある場所の住所を計算で出す」方法です。ポイントは 2 つ。
選択肢 ア はまさに「関数を使ってキー値から格納アドレスを求めてアクセスする」という内容なので、そのまま正解です。よって ア。
なぜ他の選択肢が違うのか(似ている 3 つを見分ける)
| 選択肢 | 説明されている中身 | 正体 | ハッシュ法との決定的な違い |
|---|---|---|---|
| イ | 各データが「次のデータの住所」を持っていて、それをたどっていく | リスト(連結リスト)/ポインタによるアクセス | 計算ではなく矢印を順にたどる。先頭から順に追うので、遠くのデータほど時間がかかる |
| ウ | キー値と格納アドレスの対応表を用意しておき、それを引いて場所を知る | 索引(インデックス)による アクセス | ハッシュ法は表を持たない。その場で計算するから表がいらない、というのが売り。ここが最大のひっかけ |
| エ | キー値をそのまま格納アドレスとして使う | 直接アクセス法 | 関数を通していない。キー値が学生番号 20230001 のような大きな数だと、その番号の分だけ場所を用意することになり現実的でない。だから関数で小さい数に変換するのがハッシュ法 |
特に ウ と エ は要注意です。ウは「表を引く」、エは「計算しない」。ハッシュ法は「表を引かずに、計算して住所を出す」——この一言で 3 つとも切れます。
速解法
ハッシュ法・リスト・索引・直接アクセスの 4 点セットはこの形で繰り返し出題されるので、上の表ごと覚えてしまうのが最短です。