基本情報技術者試験および情報セキュリティマネジメント試験について、2022年4月25日に大幅な試験制度の変更が発表されました。
特に基本情報技術者試験の午後試験が科目B試験となり、範囲が「アルゴリズム」「セキュリティ」の2つに限定されたのには驚きを隠せません。
さらにこれらは従来の長文問題ではなく、やや長めの小問形式となります。
具体例として、サンプル問題が提示されていましたので、このページではその解説を紹介したいと思います。
〔分野:アルゴリズムとプログラミング(擬似言語)〕
問1 次のプログラム中の に入れる正しい答えを,解答群の中から選べ。
ある施設の入場料は,0 歳から 3 歳までは 100 円,4 歳から 9 歳までは 300 円,10 歳以上は 500 円である。関数 fee は,年齢を表す 0 以上の整数を引数として受け取り,入場料を返す。
〔プログラム〕
◯整数型: fee(整数型: age)
整数型: ret
if (age が 3 以下)
ret ← 100
elseif ( )
ret ← 300
else
ret ← 500
endif
return ret
解答群
- (age が 4 以上) and (age が 9 より小さい)
- (age が 4 と等しい) or (age が 9 と等しい)
- (age が 4 より大きい) and (age が 9 以下)
- age が 4 以上
- age が 4 より大きい
- age が 9 以下
- age が 9 より小さい
解答・解説
解答
カ
解説
空欄の条件に当てはまる際の処理が ret ← 300 (入場料を300円と判定)であることから、空欄には「4 歳から 9 歳まで」に相当する条件が入ることになります。
ただ、選択肢に「(age が 4 以上) and (age が 9 以下)」という条件はありません。
ここで前段のif文の条件に着目すると、「(age が 3 以下)」となっており、これにより「(age が 4 以上)」の条件はあらためて記載する必要がないことがわかります。
よって答えは、「age が 9 以下」になります。
出題趣旨
年齢によって決まる施設の入場料を返す処理を題材として,与えられた仕様を満たす選択処理を可能にする条件式を導く能力を問う。
問2 次のプログラム中の a と b に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。
次のプログラムは,整数型の配列arrayの要素の並びを逆順にする。
〔プログラム〕
整数型の配列: array ← {1, 2, 3, 4, 5}
整数型: right, left
整数型: tmp
for (left を 1 から (arrayの要素数 ÷ 2 の商) まで 1 ずつ増やす)
right ← a
tmp ← array[right]
array[right] ← array[left]
b ← tmp
endfor
解答群
a | b | |
ア | array の要素数 - left | array[left] |
イ | array の要素数 - left + 1 | array[right] |
ウ | array の要素数 - left + 1 | array[left] |
エ | array の要素数 - left | array[right] |
解答・解説
解答
ウ
解説
for文の中を見ると
tmp ← array[right]
array[right] ← array[left]
となっていることから
①配列の右の項目をtmpに退避
②左の項目を右枠に入れる
③tmpに退避させた元右の項目を左枠に入れる
という処理を端から繰り返していくような処理だと推測できます。
これを踏まえると
a にはleft=1のときに5、left=2のときに4となるような式が
b には上記③の左枠に相当するもの
が入ることがわかります。
これを満たす選択肢はウになります。
なお具体的には次の流れになります。
- for文1周目(left=1)
- right=5
- tmp=5
- array={1, 2, 3, 4, 1}
- array={5, 2, 3, 4, 1}
- for文2周目(left=2)
- right=4
- tmp=4
- array={5, 2, 3, 2, 1}
- array={5, 4, 3, 2, 1}
出題趣旨
配列の要素の並びを逆順にする処理を題材として,配列の概念を理解した上で,正しく処理を実装する能力を問う。
問3 次のプログラム中の a と b に入れる正しい答えの組合せを,解答群の中から選べ。
手続 append は,引数で与えられた文字を単方向リストに追加する手続である。単方向リストの各要素は,クラス ListElement を用いて表現する。クラス ListElement の説明を図に示す。ListElement 型の変数はクラス ListElement のインスタンスの参照を格納するものとする。大域変数 listHead は,単方向リストの先頭の要素の参照を格納する。リストが空のときは,listHead は未定義である。
メンバ変数 | 型 | 説明 |
var | 文字型 | リストに格納する文字。 |
next | ListElement | リストの次の文字を保持するインスタンスの参照。初期状態は未定義である。 |
コンストラクタ | 説明 | |
ListElement(文字型: qVal) | 引数 qVal でメンバ変数 val を初期化する。 | |
図 クラス ListElement の説明 |
〔プログラム〕
大域: ListElement: listHead ← 未定義の値
◯append(文字型: qVal)
ListElement: prev, curr
curr ← ListElement(qVal)
if (listHead が a )
listHead ← curr
else
prev ← listHead
while (prev.next が 未定義でない)
prev ← prev.next
endwhile
prev.next ← b
endif
解答群
a | b | |
ア | 未定義 | curr |
イ | 未定義 | curr.next |
ウ | 未定義 | listHead |
エ | 未定義でない | curr |
オ | 未定義でない | curr.next |
カ | 未定義でない | listHead |
解答・解説
解答
ア
解説
if文の中の処理は listHead ← curr 、else文の中の処理は prev ← listHead となっているため
if文は listHead が未定義の場合、else文は listHead が未定義でない場合の処理と解ります。
また、手続 append は引数で与えられた文字を単方向リストに追加する手続のため、prev.next に入れる b は、if文の前に定義されている curr ← ListElement(qVal) が適切です。
出題趣旨
クラスを用いて各要素を表現した単方向リストを題材として,単方向リストに要素を追加する処理を実装する能力を問う。
問4 次の記述中の a ~ c に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は 1 から始まる。
要素の多くが 0 の行列を疎行列という。次のプログラムは,二次元配列に格納された行列のデータ量を削減するために,疎行列の格納に適したデータ構造に変換する。
関数 transformSparseMatrix は,引数 matrix で二次元配列として与えられた行列を,整数型配列の配列に変換して返す。関数 transformSparseMatrix を transformSparseMatrix({{3, 0, 0, 0, 0}, {0, 2, 2, 0, 0}, {0, 0, 0, 1, 3}, {0, 0, 0, 2, 0}, {0, 0, 0, 0, 1}})として呼び出したときの戻り値は,{{ a }, { b }, { c }} である。
〔プログラム〕
◯整数型配列の配列: transformSparseMatrix(整数型の二次元配列: matrix)
整数型: i, j
整数型配列の配列: sparseMatrix
sparseMatrix ← {{}, {}, {}} /* 要素数0の配列を三つ要素にもつ配列 */
for (i を 1 から matrixの行数 まで 1 ずつ増やす)
for (j を 1 から matrixの列数 まで 1 ずつ増やす)
if (matrix[i, j] が 0 でない)
sparseMatrix[1]の末尾 に iの値 を追加する
sparseMatrix[2]の末尾 に jの値 を追加する
sparseMatrix[3]の末尾 に matrix[i, j]の値 を追加する
endif
endfor
endfor
return sparseMatrix
解答群
a | b | c | |
ア | 1, 2, 2, 3, 3, 4, 5 | 1, 2, 3, 4, 5, 4, 5 | 3, 2, 2, 1, 2, 3, 1 |
イ | 1, 2, 2, 3, 3, 4, 5 | 1, 2, 3, 4, 5, 4, 5 | 3, 2, 2, 1, 3, 2, 1 |
ウ | 1, 2, 3, 4, 5, 4, 5 | 1, 2, 2, 3, 3, 4, 5 | 3, 2, 2, 1, 2, 3, 1 |
エ | 1, 2, 3, 4, 5, 4, 5 | 1, 2, 2, 3, 3, 4, 5 | 3, 2, 2, 1, 3, 2, 1 |
解答・解説
解答
イ
解説
処理の内容は、transformSparseMatrix の中身を、
1行目の1列目、1行目の2列目、…
と順に確認し、その値が0でない場合に
行を a の末尾に追加
列を b の末尾に追加
値を c の末尾に追加
するものです。
よって、transformSparseMatrix は
({{3①, 0, 0, 0, 0}, {0, 2②, 2③, 0, 0}, {0, 0, 0, 1④, 3⑤}, {0, 0, 0, 2⑥, 0}, {0, 0, 0, 0, 1⑦}})
の添え字の順でヒットしていき
- ①時点の戻り値(sparseMatrix)
{{1}{1}{3}} - ②時点の戻り値(sparseMatrix)
{{1, 2}{1, 2}{3, 2}} - …
- ⑦時点の戻り値(sparseMatrix)
{{1, 2, 2, 3, 3, 4, 5}{1, 2, 3, 4, 5, 4, 5}{3, 2, 2, 1, 3, 2, 1}}
となります。
出題趣旨
多変量解析や機械学習などを用いたデータサイエンスの取組に当たっては,データを,特性に応じた構造に変換することがある。本問では,疎行列の格納に適したデータ構造への変換を題材として,プログラムの動作の理解を問う。
問5 次のプログラム中の に入れる正しい答えを,解答群の中から選べ。
任意の異なる 2 文字を c1,c2 とするとき,英単語群に含まれる英単語において,c1 の次に c2 が出現する割合を求めるプログラムである。英単語は,英小文字だけから成る。英単語の末尾の文字が c1 である場合,その箇所は割合の計算に含めない。例えば,図に示す 4 語の英単語“importance”,“inflation”,“information”,“innovation”から成る英単語群 において,c1 を“n”,c2 を“f”とする。英単語の末尾の文字以外に“n”は五つあり,そのうち次の文字が“f”であるものは二つである。したがって,求める割合は,2 ÷ 5 = 0.4 である。c1 と c2 の並びが一度も出現しない場合,c1 の出現回数によらず割合を 0 と定義する。
プログラムにおいて,英単語群は Words 型の大域変数 words に格納されている。クラス Words のメソッドの説明を,表に示す。本問において,文字列に対する演算子“+”は,文字列の連結を表す。また,整数に対する演算子“÷”は,実数として計算する。
メソッド | 戻り値 | 説明 |
freq(文字列型: str) | 整数型 | 英単語群中の文字列 str の出現回数を返す。 |
freqE(文字列型: str) | 整数型 | 英単語群の中で,文字列 str で終わる英単語の数を返す。 |
〔プログラム〕
大域: Words: words /* 英単語群が格納されている */
/* c1の次にc2が出現する割合を返す */
◯実数型: prob(文字型: c1, 文字型: c2)
文字列型: s1 ← c1の1文字だけから成る文字列
文字列型: s2 ← c2の1文字だけから成る文字列
if (words.freq(s1 + s2) が 0 より大きい)
return
else
return 0
endif
解答群
- (words.freq(s1) - words.freqE(s1)) ÷ words.freq(s1 + s2)
- (words.freq(s2) - words.freqE(s2)) ÷ words.freq(s1 + s2)
- words.freq(s1 + s2) ÷ (words.freq(s1) - words.freqE(s1))
- words.freq(s1 + s2) ÷ (words.freq(s2) - words.freqE(s2))
解答・解説
解答
ウ
解説
if文の条件では、s1+s2(c1 の次に c2 が出現する場合)が指定されており、空欄には、求める確率(c1 の次に c2 が出現する割合)の式が入ることがわかります。
なお、else つまり条件に合致しない場合は、当然 0 になります。
問題文で、英単語の末尾の文字が c1 である場合を除くとの指定があるので、空欄の式の分母は
c1 の出現回数 − 末尾の文字が c1 で終わる英単語の数
が適切であり、分子は
c1 の次に c2 が出現する数
が適切です。
これを満たす式はウになります。
出題趣旨
文書を構成する言葉や文字に関する統計情報は,自然言語処理などに活用されている。本問では,ある文字に後続する文字の出現割合の計算を題材として,問題文に示されたプログラムの仕様を理解した上で,ライブラリを適切に利用し,正しく処理を実装する能力を問う。
〔分野:情報セキュリティ〕
問6 製造業の A 社では,EC サイト(以下,A 社の EC サイトを A サイトという)を使用し,個人向けの製品販売を行っている。A サイトは,A 社の製品やサービスが検索可能で,ログイン機能を有しており,あらかじめ A サイトに利用登録した個人(以下,会員という)の氏名やメールアドレスといった情報(以下,会員情報という)を管理している。A サイトは,B 社の PaaS で稼働しており,PaaS 上の DBMS とアプリケーションサーバを利用している。
A 社は,A サイトの開発,運用を C 社に委託している。A 社と C 社との間の委託契約では,Web アプリケーションプログラムの脆弱性対策は,C 社が実施するとしている。
最近,A 社の同業他社が運営している Web サイトで脆弱性が悪用され,個人情報が漏えいするという事件が発生した。そこで A 社は,セキュリティ診断サービスを行っている D 社に,A サイトの脆弱性診断を依頼した。脆弱性診断の結果,対策が必要なセキュリティ上の脆弱性が複数指摘された。図 1 に D 社からの指摘事項を示す。
(一) A サイトで利用している DBMS に既知の脆弱性があり,脆弱性を悪用した攻撃を受けるおそれがある。
(二) A サイトで利用しているアプリケーションサーバの OS に既知の脆弱性があり,脆弱性を悪用した攻撃を受けるおそれがある。
(三) ログイン機能に脆弱性があり,A サイトのデータベースに蓄積された情報のうち,会員には非公開の情報を閲覧されるおそれがある。
図 1 D 社からの指摘事項
設問 図 1 中の項番(一)~(三)それぞれに対処する組織の適切な組合せを,解答群の中から選べ。
(一) | (二) | (三) | |
ア | A 社 | A 社 | A 社 |
イ | A 社 | A 社 | C 社 |
ウ | A 社 | B 社 | B 社 |
エ | B 社 | B 社 | B 社 |
オ | B 社 | B 社 | C 社 |
カ | B 社 | C 社 | B 社 |
キ | B 社 | C 社 | C 社 |
ク | C 社 | B 社 | B 社 |
ケ | C 社 | B 社 | C 社 |
コ | C 社 | C 社 | B 社 |
解答・解説
解答
オ
解説
クラウドサービス利用時の責任範囲(AWSで言うところの責任共有モデル)の問題です。
AシステムはPaaS(文脈から少なくともOSとDBMSを提供)を利用しているため、それらの脆弱性(一)、(二)については、PaaSを提供しているB社が対処する必要があります。
また、ログイン機能の脆弱性(三)については、A社側が対処する必要がありますが、委託契約によりアプリケーションの脆弱性対策はC社実施と明記されていますので、C社が対処する必要があります。
出題趣旨
パブリッククラウド上での EC サイトのセキュアな運用を題材として,クラウドサービスを利用する際の,委託先などとの適切な責任共有の在り方を判断する能力を問う。