09 過去問演習ー5(全分野 横断・5周目)

全9問。1〜4周目とは別の問題です。

配列問1 ★2次元配列を回転して移す流れ図

過去問(配列)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2020-12-13 問8〕
解説を表示

正解:エ

8×8のマス目(配列A)の模様を、別の8×8のマス目(配列B)に移しかえる問題です。二重ループで ij も 0〜7 まで動くので、Aの全64マスを1つずつBのどこかへ配るという処理になります。a に入るのは、その「配り先の住所の決め方」です。

まず、模様がどう変わったかを見る

配列Aの★の並びを言葉にすると、こんな形です。

アルファベットの「F」を思い浮かべてください。実行後の配列Bを見ると、その棒が全部90度たおれています。

Aの「縦の棒」がBでは「横の棒」に、Aの「横の棒」がBでは「縦の棒」になっています。つまりこれは図形を時計回りに90度回転させた、ということです。

代表の1マスで確かめる(これが一番速い)

全64マス調べる必要はありません。特徴的な1マスを選んで、選択肢に当てはめるだけで答えが出ます。

使いやすいのは、Aの左上の★=A(0, 1)i=0、j=1)です。ではこの★はBのどこにあるはずでしょうか。Aの「上の横棒」はBの「右の縦棒」になったので、この★はBの右上のあたり、具体的には B(1, 7) のはずです(実行後の図で、1行目の右端に★がありますね)。

では、i=0、j=1 を各選択肢の式に入れて、B(1, 7) になるものを探します。

選択肢行き先の計算結果判定
行 = 7−i = 7、列 = 7−j = 6B(7, 6)✘ Bの左下あたり。★がない
行 = 7−j = 6、列 = i = 0B(6, 0)✘ ★がない
行 = i = 0、列 = 7−j = 6B(0, 6)✘ Bの0行目は空っぽ
行 = j = 1、列 = 7−i = 7B(1, 7)✔ 一致!

エだけが当たりました。念のため、もう2マスで検算しておきましょう。

3か所すべて合ったので、答えは で確定です。

ほかの選択肢は「どんな変形」なのか

実は不正解の3つも、それぞれ意味のある変形になっています。中身を知っておくと引っかかりません。

速解法

  1. 棒の向きが変わっていたら「回転」、変わっていなければ「鏡うつし」と、まず当たりをつける。
  2. 回転なら、特徴的な★を1個だけ選んで、移動前 (i, j) と移動後の座標をメモする。
  3. 選択肢に ij の数字を代入して、その座標になるものを選ぶ。ふつう1マスで2〜3個消え、残りは2マス目で決着します。

ちなみに「時計回り90度=B(j, 7−i)」「反時計回り90度=B(7−j, i)」「180度=B(7−i, 7−j)」はよく出る組み合わせです。ただし丸暗記より、その場で1マス代入して確かめるほうが確実で速いですよ。

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

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

正解:ア

逆ポーランド表記法(後置記法)は、「計算する数を先に並べて、記号(演算子)を後ろに置く」書き方です。ふだん私たちが書く A+B(中置記法)は、逆ポーランドでは AB+ になります。「AとBを持ってきて、それから足す」という順番です。

ステップ1:式を「かたまり」に分ける

問題の式は「分数」の形をしています。分数は割り算です。つまり全体はこういう形です。

ステップ2:小さいかたまりから逆ポーランドに直す

ふつうの書き方逆ポーランド読み方
A+BAB+AとBを足す
C+DCD+CとDを足す
A−DAD−AからDを引く

ステップ3:大きいかたまりを組み立てる

  1. 分子は「AB+ の結果」と「CD+ の結果」を掛けるので、2つを並べてから × を置く → AB+CD+×
  2. 全体は「分子の結果」と「AD− の結果」を割るので、2つを並べてから ÷ を置く → AB+CD+×AD−÷

これが選択肢アと一致します。

スタックで確かめる(コンピュータのやり方)

逆ポーランドは、左から1つずつ読んで「文字なら積む・記号なら上から2つ取り出して計算し、結果を積む」だけで計算できます。アを実際にたどってみます(スタックは左が下)。

読む記号やることスタックの中身
A積むA
B積むA, B
+AとBを取り出して足す(A+B)
C積む(A+B), C
D積む(A+B), C, D
+CとDを取り出して足す(A+B), (C+D)
×2つを取り出して掛ける(A+B)×(C+D)
A積む(A+B)×(C+D), A
D積む(A+B)×(C+D), A, D
AとDを取り出して引く(A+B)×(C+D), (A−D)
÷2つを取り出して割る{(A+B)×(C+D)}÷(A−D)

最後に問題の式そのものが残りました。アで正解です。

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

速解法

スタック問3 ★スタックの用語(LIFO)

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

正解:イ

スタックは、本を机に積み上げていくイメージのデータ構造です。取り出すときは一番上(=最後に積んだもの)から取るので、後入れ先出し(LIFO:Last In, First Out)と呼ばれます。この特徴を表す用語はイの LIFO です。

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

速解法:「スタック=LIFO(積み上げ、上から取る)」「キュー=FIFO(行列、前から取る)」の2語をセットで暗記。LILO・LRU はひっかけなので、スタック=LIFO と即答できます。

木構造問4 ★2分探索木になる木の選択

過去問(木構造)
出典:IPA 基本情報技術者試験 科目A(旧・午前)過去問〔2021-06-13 問7〕
解説を表示

正解:ウ

スタックは「あと入れ先出し(LIFO)」。A,B,C,D が順に到着し、各データは「到着したらすぐ積む(push)か、あとで積む」、そして「積んだ一番上から取り出す(pop)=それが出力」になります。到着順は必ず A→B→C→D です。各選択肢の出力列が作れるか、push(+)とpop(−)の手順で試します。

ウ C,B,D,A が作れるか

操作スタックの中(右が上)出力
A を pushA
B を pushA B
C を pushA B C
popA BC
popAC B
D を pushA DC B
popAC B D
pop(空)C B D A

ぴったり作れました。よってウが正解。

なぜ他が作れない?(どこで詰まるか)

速解法:スタックで作れない並びには「231型(あとから来た大きい数の前に、それより小さい2つが逆順で出てくる)」が現れます。A→B→C→D1→2→3→4 と読み替え、途中に「大・小・中」の逆転がある列(ア=1423, イ=2413, エ=4312)は不可、と当たりを付けられます。

アルゴリズム問5 ★再帰関数のトレース

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

正解:ウ

この関数のルールも2行だけです。

さっきの互除法と違うのは、return n + f(n−1) のように n + がくっついている点です。だから答えは「奥から戻ってくる値に、自分の n を足す」形で積み上がります。

ステップ1:奥へもぐる(呼び出しの連鎖)

ステップ2:手前へ戻る(値の確定)。いちばん奥から順に数字が決まっていきます。

計算
1f(1)n ≦ 1 なので 11
2f(2)2 + 13
3f(3)3 + 36
4f(4)4 + 610
5f(5)5 + 1015

したがって f(5)15 です。式をぜんぶ展開すると 5 + 4 + 3 + 2 + 1 = 15 で、要するに1 から n までの足し算をする関数だと分かります。

なぜ他の選択肢が違うか

速解法return n + f(n−1) で終わりが 1 なら、それは 1 + 2 + … + n の合計です。公式 n × (n + 1) ÷ 2 を使えば 5 × 6 ÷ 2 = 15 と一発。似た形の return n × f(n−1) なら階乗(5×4×3×2×1 = 120)になるので、「+ なら合計、× なら階乗」とセットで覚えておくと、トレースせずに答えを出せます。トレースする場合も、必ずいちばん奥(終了条件)から手前へ値を確定させるのがミスを防ぐコツです。

アルゴリズム問6 ★引き算による互除法の比較回数

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

正解:エ

こちらは割り算を使わない互除法です。「大きいほうから小さいほうを引く」を、2つの数が等しくなるまで繰り返します。等しくなった値が最大公約数です。

流れ図の動きを言葉にすると、こうなります。

聞かれているのは「比較が何回で終わるか」なので、ひし形を通った回数を数えます。最後の「等しかった」という比較も、ちゃんと1回に数えるのがポイントです。

比較LS判定実行する引き算
1876204L > SL ← 876 − 204 = 672
2672204L > SL ← 672 − 204 = 468
3468204L > SL ← 468 − 204 = 264
4264204L > SL ← 264 − 204 = 60
560204L < SS ← 204 − 60 = 144
660144L < SS ← 144 − 60 = 84
76084L < SS ← 84 − 60 = 24
86024L > SL ← 60 − 24 = 36
93624L > SL ← 36 − 24 = 12
101224L < SS ← 24 − 12 = 12
111212L = S出力して終了

よって比較の回数は 11 回です。

検算:876 = 12×73、204 = 12×17 なので最大公約数は 12。表の最後で L も S も 12 になっているので、トレースは正しいと確認できます。

なぜ他の選択肢が違うか

速解法:割り算の互除法で「商」を先に出すと、引き算の回数がまとめて分かります。876 ÷ 204 = 商4 余り60、204 ÷ 60 = 商3 余り24、60 ÷ 24 = 商2 余り12、24 ÷ 12 = 商2 余り0。引き算の回数は商の合計ですが、最後の段はちょうど割り切れるので実際には最後の1回を引く手前で等しくなります。4 + 3 + 2 + 2 − 1 = 10回の引き算、それに終了判定の比較1回を足して 11回。表を全部書かなくても検算できます。試験では「比較回数を聞かれたら、引き算回数 + 1」と覚えておくと安全です。

流れ図問7 ★商と余りを求める流れ図

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

正解:イ

この流れ図は、割り算の筆算をコンピュータにやらせるとどうなるか、を表しています。やっていることはとてもシンプルで、「x から y を引けなくなるまで引き続け、何回引けたかを数える」だけです。

ステップ1:変数の役割をつかむ

ステップ2:ループの動きを読む

  1. 判断 r < y:「残りが y より小さい?」
  2. Yes(小さい)なら終了。もう y を引けないので、そこで止まる。
  3. No(まだ y 以上)ならr ← r − y(残りから y を引く)と q ← q + 1(引いた回数を1増やす)をして、判断に戻る。

つまり「引けるうちは引いて、回数を数える」。これは小学校で習う割り算そのものです。「17 の中に 5 はいくつある?」を、17−5−5−5=2 と引いて確かめるのと同じことをしています。

ステップ3:実際に数字でトレースする

x=17, y=5 でやってみます。

判断 r < y結果rq
初期170
117 < 5 ?No → 引く121
212 < 5 ?No → 引く72
37 < 5 ?No → 引く23
42 < 5 ?Yes → 終了23

終わったとき q = 3、r = 2。一方 17 ÷ 5 = 商 3 余り 2 です。ぴったり一致します。

したがって q は x ÷ y の商r は x ÷ y の余り。これはイです。

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

速解法

探索問8 ★2分探索(データが4倍のとき)

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

正解:イ

2分探索は、並んでいるデータのまん中を見て、探す値がその前half・後half どちらにあるかを判断し、範囲を半分に捨てていく探し方です。「1回調べるごとに、候補が半分になる」——ここがすべての出発点です。

ステップ1:最大何回で見つかるかを考える

データが n 個あるとき、調べるたびに候補が半分になるので、残りの候補は次のように減ります。

調べた回数残りの候補
0回n
1回n ÷ 2
2回n ÷ 4
3回n ÷ 8
k回n ÷ 2k

候補が1個になったら終わりなので、「n を何回半分にすれば1になるか」が最大の回数です。これは log2 n(2を何回掛けたら n になるか、の逆)で表せます。細かく言えば最大探索回数はおよそ log2 n + 1 ですが、この問題では「+1」の部分は後で消えるので気にしなくて大丈夫です。

ステップ2:データが4倍になったら?

データが n から 4n に増えたときの回数のを見ます。

ここで「4n を1になるまで半分にする」のは、「まず4nを半分にして2n、もう一度半分にして n、そこから先は元と同じ」という手順です。つまり最初に2回だけ余分に半分にすれば、あとは元の n の場合とまったく同じ。よって増えるのは 2回だけです。

式で書くと log2(4n) = log2 4 + log2 n = 2 + log2 n となり、やはり差はちょうど2回。答えはイです。

ステップ3:具体的な数で確かめる

データ数1になるまで半分にする回数
1,024個10回(1024→512→…→1)
4,096個(4倍)12回
1,048,576個(約100万)20回
4,194,304個(4倍)22回

データが1,000個でも100万個でも、4倍にしたときに増えるのはいつも2回。データ量に関係なく一定なのが2分探索の強みです。

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

速解法

探索問9 ★ハッシュ法(最初の衝突)

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

正解:ウ

この問題は「ハッシュ表にデータを順番に入れていったとき、どのデータで最初に場所の取り合い(衝突)が起きるか」を聞いています。ハッシュ表とは「データから計算した番号の場所にしまう入れ物」のことで、ここではしまう場所の番号を「データを 8 で割った余り」で決めます。

ステップ1:16進数を8で割った余りの求め方

データは 16 進数(0〜9 のあとに A=10, B=11, C=12, D=13, E=14, F=15 と続く数え方)で書かれています。まともに 10 進数へ直してもよいのですが、実は下 1 桁だけ見れば十分です。理由は、16 進数の上の桁は必ず 16 の倍数(16、256、…)を表し、16 も 256 も 8 で割り切れるからです。つまり上の桁は余りに影響しません。

なので「下 1 桁を 8 で割った余り」を見るだけで解けます。

ステップ2:順番に表へ入れていくトレース表

順番データ下1桁の値8で割った余り=しまう場所結果
11AA = 102場所2は空 → 入る
23555場所5は空 → 入る
33BB = 113場所3は空 → 入る
45444場所4は空 → 入る
58EE = 146場所6は空 → 入る
6A111場所1は空 → 入る
7AFF = 157場所7は空 → 入る
8B222場所2はすでに 1A が使用中 → 衝突!
9B333(3B と衝突するが、B2 より後)

8 番目の B2 で、1 番目に入れた 1A と同じ場所 2 に入ろうとします。ここが最初の衝突です。よって答えは

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

速解法

  1. 「8 で割った余り」= 16 進数の下 1 桁だけ見る(上の桁は 8 で割り切れるので無視)。
  2. 下 1 桁が 0〜7 ならそのまま、8〜F なら 8 を引く。A→2、B→3、E→6、F→7。
  3. 余りを左から順に書き出す:2, 5, 3, 4, 6, 1, 7, 2, 3。
  4. 左から読んで最初に同じ数字が 2 回目に出てきた所を指す。2 が二度目に出るのは 8 番目 → B2

余りの列を書き出してしまえば、あとは「同じ数字の 2 回目探し」だけなので 30 秒で解けます。


【練習リンク】