【基本情報技術者試験】公開問題解説(科目B)
はじめに
IPAのホームページで公開された、令和5年度の問題を解説します。(後編)
本ページに記載されている問題はこちらから引用しています。
https://www.ipa.go.jp/shiken/mondai-kaiotu/sg_fe/koukai/t6hhco0000003zx0-att/2023r05_fe_kamoku_b_qs.pdf
科目A解説の前編はこちら
科目B
問1
【考え方】
a は大きなループを回す条件(入力した数まで1ずつ増やしていくループ)なので、maxNum でいいでしょう。
b は小さいループでdivideFlag をfalse にするための条件と分かります。
b のif 文の中に入ると、divideFlag がfalse になり、αの行のfor ループから抜けます。そして、下のif 文はスキップされるので、1行目のfor ループに戻ります。
下のif 文では、i が素数の場合にpnList の末尾に追加されます。つまり、
divideFlag がtrue --> i は素数
divideFlag がfalse --> i は非素数
よってb にはi が非素数になる条件、つまりi がi より小さい数で割り切れるという条件が入ると考えられます。
答えはア
問2
【考え方】
呼ばれた順番通りに関数を追っていきます。
proc2()
proc3()
"C" 出力
"B" 出力
proc1()
"A" 出力
proc3()
"C" 出力
答えはク
問3
【考え方】
何を行う関数なのかを念頭に置いて、プログラムを読んでいく。
○sort(整数型: first, 整数型: last)
整数型: pivot, i, j
pivot ← data[(first + last) ÷ 2 の商] // 要素の真ん中の数をピボットと定める
i ← first
j ← last
while (true)
while (data[i] < pivot)
i ← i + 1 // 左から順に、ピボットより小さいか判定する。3周目でwhile 終了
endwhile
while (pivot < data[j])
j ← j - 1 // 右から順に、ピボットより大きいか判定する。3周目でwhile 終了
endwhile
if (i ≧ j) // i = 3, j = 3 なので、繰り返し処理を終了する。αの行に飛ぶ
繰返し処理を終了する
endif
data[i]とdata[j]の値を入れ替える // ピボット以上のdata[i] とピボット以下のdata[j]を入れ替える
i ← i + 1
j ← j - 1
endwhile // ここまでの処理で、左側にはピボット以下の数字、右側にはピボット以上の数字が並ぶ
dataの全要素の値を要素番号の順に空白区切りで出力する /*** α ***/
if (first < i - 1)
sort(first, i - 1) // first ~ i-1 の数を昇順に並べる
endif
if (j + 1 < last)
sort(j + 1, last) // j+1 ~ last の数を昇順に並べる
endif
// 全ての数が昇順に並ぶ
α の行を最初に実行したときは、ピボット(=3)以下の数が左側、ピボット以上の数が右側に配置されている状態で、今回はデータの入れ替えは行われていない状態です。
答えはエ
※クイックソートの関数ですね
問4
【考え方】
イメージがしづらいので、1行ずつ追ってみる。
// 最初の状態は、{-1, -1, -1, -1, -1}
add(3)
calcHash1(3)
return (3 mod 5) + 1 // =4
i = 4
if (hashArray[4] == -1) // true
hashArray[4] = 3
return true
// {-1, -1, -1, 3, -1}
add(18)
calcHash1(18)
return (18 mod 5) + 1 // =4
i = 4
if (hashArray[4] == -1 // false
else
calcHash2(18)
return ((18 + 3) mod 5) + 1 // =2
i = 2
if (hashArray[2] == -1) // true
hashArray[2] = 18
return true
// {-1, 18, -1, 3, -1}
add(11)
calcHash1(11)
return (11 mod 5) + 1 // =2
i = 2
if (hashArray[2] == -1) // false
else
calcHash2(11)
return ((11 + 3) mod 5) + 1 // =5
i = 5
if (hashArray[5] == -1 // true
hashArray[5] = 11
return true
// {-1, 18, -1, 3, 11} 答えはエ
関数という形だと訳が分からないと思いますが、一行ずつ見れば難しくはないと思いますので、じっくり眺めて問題を解いてください。
問5
【考え方】
numerator: 分子、denominator: 分母と語句の意味が分からなくとも、コードを読んで選択肢を絞ることができます。
まず、関数の返り値が
similarity = numerator / denominator
とあるので、
$${\text{numerator}=a_{1}b_{1}+a_{2}b_{2}+\cdots+a_{n}b_{n}}$$
$${\text{denominator}=\sqrt{a^2_{1}+a^2_{2}+\cdots+a^2_{n}}\sqrt{b^2_{1}+b^2_{2}+\cdots+b^2_{n}}}$$
であると考えられます。
分子の方は、1つのfor 文で完結しており、各要素のi番目同士を掛け合わせ、追加するのを1からn までループするので
$${\text{numerator}=a_{1}b_{1}+a_{2}b_{2}+\cdots+a_{n}b_{n}}$$
for (i を 1 から vector1の要素数 まで 1 ずつ増やす)
numerator = numerator + voctor1[i] * vector2[i]
endfor
分母の方は、2つ目のfor 文で$${\text{temp}=a^{2}_1+a^{2}_2+\cdots+a^{2}_n}$$
$${\text{denominator}=\sqrt{a^{2}_1+a^{2}_2+\cdots+a^{2}_n}}$$・・・①
がはじめに格納されます。
3つ目のfor 文で$${\text{temp}=b^{2}_1+b^{2}_2+\cdots+b^{2}_n}$$・・・②
denominatorのゴールは、①×√②であるため、
$${\text{denominator}=\text{denominator}\times \text{(tempの正の平方根)}}$$
よって答えはエ
問6
【考え方】
発見事項にリスクが書かれており、それと関連する選択肢を選ぶ
ア 電子メールの差出人アドレス、件名、本文及び添付ファイル名が公開されているため、攻撃者は偽装が容易と考えられる。
イ この場合の業務の遅延は、情報セキュリティリスクとは関係ない
ウ この段階でメールを盗聴されてもすでに暗号化されているため、身代金を要求することはできないと考えられます
エ BサーバへのアクセスはID・PWが必要なので、簡単には漏えいしないでしょう