令和元年度秋期 基本情報技術者試験 午前 問7~問10|過去問解説

令和元年度秋期・基本情報技術者試験の午前問7~問10を解説します。BNFによる変数名の定義、スタック、二次元配列の変換、ハッシュ関数による格納位置を扱います。

Share
【基本情報処理技術者試験】最新問題のテクノロジ系をまったり解く 問7~問10【令和元年度秋試験】

この記事について
2019年(令和元年度)秋期に実施された基本情報技術者試験 午前の問7~問10を扱う過去問解説です。現在の試験制度や出題形式とは一部異なりますが、コンピュータサイエンスの基礎学習には引き続き活用できます。

出典・引用について
問題文、選択肢および試験問題に含まれる図表は、独立行政法人情報処理推進機構(IPA)が公開している令和元年度秋期試験から引用しています。掲載にあたり、改行、表組み、全角・半角、画像配置などを調整している場合があります。問題の趣旨は変更していません。解説、補足、計算過程および当サイト作成の図は、工学じじいの縁側日記によるものです。
IPA公式・問題冊子(PDF)IPA公式・解答例(PDF)2019年度の過去問題一覧

R01基本情報技術者試験 秋期試験に挑戦

令和元年度 基本情報技術者試験 午前問題 問7~問10

令和元年度 基本情報技術者試験 午前問題 問7

出典:令和元年度 秋期 基本情報技術者試験 午前 問7

次のBNFで定義される変数名に合致するものはどれか。

<数字>   ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<英字>   ::= A | B | C | D | E | F
<英数字> ::= <英字> | <数字> | _
<変数名> ::= <英字> | <変数名><英数字>
選択肢 文字列
_B39
246
3E5
F5_1

解説

BNF(Backus-Naur Form)の問題です。

BNFの基本的な読み方は、次のとおりです。

<左辺> ::= <右辺>

これは、左辺を右辺の規則によって生成できるという意味です。

今回調べる規則は、次の部分です。

<変数名> ::= <英字> | <変数名><英数字>

変数名は、最初の1文字が必ず英字になります。その後ろには、英字、数字、またはアンダースコアを追加できます。

各選択肢を分解すると、次のようになります。

ア  _B39 = <英数字><英字><数字><数字>
イ  246  = <数字><数字><数字>
ウ  3E5  = <数字><英字><数字>
エ  F5_1 = <英字><数字><英数字><数字>

ア、イ、ウは、先頭が英字ではありません。したがって、変数名の規則には合致しません。

エの F5_1 は、次のように生成できます。

F
↓
F5
↓
F5_
↓
F5_1

BNFの記号で表すと、次の流れです。

<変数名>
→ <英字>
→ <英字><英数字>
→ <英字><英数字><英数字>
→ <英字><英数字><英数字><英数字>
→ F5_1

よって、エの F5_1 が正解です。

令和元年度 基本情報技術者試験 午前問題 問8

出典:令和元年度 秋期 基本情報技術者試験 午前 問8

A、C、K、S、Tの順に文字が入力される。スタックを利用して、S、T、A、C、Kという順に文字を出力するために、最小限必要となるスタックは何個か。

ここで、どのスタックにおいても、ポップ操作が実行されたときには必ず文字を出力する。また、スタック間で文字を移動することはできない。

選択肢 スタック数
1
2
3
4

解説

スタックは、後入れ先出し(LIFO)のデータ構造です。

push(x)でデータを積み、pop()で一番上のデータを取り出します。

例えば、次の順番で操作します。

① push(3)
② push(5)
③ push(2)
④ pop()    → 2を取り出す
⑤ push(1)
⑥ pop()    → 1を取り出す
⑦ pop()    → 5を取り出す

スタックの状態は、次のように変化します。左側が取り出し口、右側が底です。

操作前          [                 ]
push(3)         [ 3               ]
push(5)         [ 5 | 3           ]
push(2)         [ 2 | 5 | 3       ]
pop() → 2       [ 5 | 3           ]
push(1)         [ 1 | 5 | 3       ]
pop() → 1       [ 5 | 3           ]
pop() → 5       [ 3               ]

今回の入力順は、次のとおりです。

入力順:A → C → K → S → T
出力順:S → T → A → C → K

スタックが1個の場合、すべて積むと次の状態になります。

[ T | S | K | C | A ]

最初に取り出せるのはTなので、Sから出力できません。

スタックが2個の場合、Tを別のスタックへ入れることでS、Tまでは取り出せます。

スタック1:[ S | K | C | A ]
スタック2:[ T             ]

しかし、その後にA、C、Kの順で取り出せません。

配置を工夫しても、2個ではCとKの順番を解決できません。

スタック1:[ S | A     ]
スタック2:[ T | K | C ]

スタックを3個にすると、次のように配置できます。

スタック1:[ S | A ]
スタック2:[ T | K ]
スタック3:[ C     ]

この状態なら、次の順番で取り出せます。

S → T → A → C → K

よって、ウの3個が正解です。

令和元年度 基本情報技術者試験 午前問題 問9

出典:令和元年度 秋期 基本情報技術者試験 午前 問9

配列Aが図2の状態のとき、図1の流れ図を実行すると、配列Bが図3の状態になった。図1のaに入れる操作はどれか。

ここで、配列A、Bの要素を、それぞれ A(i,j)B(i,j) とする。

流れ図

図1 流れ図

配列Aの状態

図2 配列Aの状態

実行後の配列Bの状態

図3 実行後の配列Bの状態

選択肢 操作
B(7-i, 7-j) ← A(i,j)
B(7-j, i) ← A(i,j)
B(i, 7-j) ← A(i,j)
B(j, 7-i) ← A(i,j)

解説

配列のインデックスを使って、配列Aの配置を時計回りに90度回転させる問題です。

図2と図3を見比べると、例えば次の位置が対応しています。

A(0,1) → B(1,7)
A(7,1) → B(1,0)
A(3,4) → B(4,4)

まず、A(0,1) → B(1,7)を各選択肢へ代入します。

ア  B(7-0, 7-1) = B(7,6)
イ  B(7-1, 0)   = B(6,0)
ウ  B(0, 7-1)   = B(0,6)
エ  B(1, 7-0)   = B(1,7)

この時点で、エが対応しています。

ほかの座標でも確認します。

A(7,1) → B(1,0)

エ:B(1, 7-7)
   = B(1,0)
   → 一致
A(3,4) → B(4,4)

エ:B(4, 7-3)
   = B(4,4)
   → 一致

よって、エが正解です。

令和元年度 基本情報技術者試験 午前問題 問10

出典:令和元年度 秋期 基本情報技術者試験 午前 問10

10進法で5桁の数 a1a2a3a4a5 を、ハッシュ表を用いて配列へ格納したい。

ハッシュ関数を次のように定める。

mod(a1 + a2 + a3 + a4 + a5, 13)

求めたハッシュ値に対応する位置の配列要素へ格納する場合、54321は配列のどの位置に入るか。

ここで、mod(x,13)は、xを13で割った余りとする。

選択肢 配列の位置
1
2
7
11

解説

指定されたハッシュ関数へ、54321の各桁を代入します。

mod(5 + 4 + 3 + 2 + 1, 13)
= mod(15, 13)
= 2

ハッシュ値は2なので、イが正解です。

次回予告

次回も、まったり問11から解いていこうと思います。
参考になれば幸いです。


シリーズ内の記事

内容の誤りや分かりにくい箇所は、お問い合わせページからお知らせください。