【基本情報技術者試験】公開問題解説(科目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が必要なので、簡単には漏えいしないでしょう

この記事が気に入ったらサポートをしてみませんか?