P 社は,セキュリティを確保するために自社ビルを 10 の区画に分け,各区画への入退室を IC カードで行うシステムを導入し,その管理方法についての検証を始めた。この IC カードを使った入退室管理(以下,入退室管理という)の概要は次のとおりであり,入退室管理で用いるデータベースの構造(一部)を図 1 に示す。 〔入退室管理の概要〕 (1) 社員は一つの部署に所属し,IC カードを 1 人 1 枚貸与される。IC カードはカード固有の IC カード番号をもつ。IC カードの情報は IC カード登録表に登録される。 (2) 社員の入退室が許可されている区画は個別に決められており,許可された区分の情報が入退室許可表に登録される。入退室が可能な場合で,その区画が所属部署の入っている区画の場合は “1”,それ以外で入退室が必要と認められた区画の場合は “2” が,入退室許可表の許可区分に登録される。 (3) 各区画には IC カードリーダが設置されており,入退室が許可された IC カード番号を読み取ったときだけドアを解錠し,入退室の記録を入退室記録表に記録する。このとき,入室の場合は “1”,退室の場合は “−1” を入退室記録表の入退室区分に記録する。 なお,P 社は,社員に対して午前 0 時までに退社することを義務づけている。 P社では,一度の解錠で同時に複数の社員が入退室することがあり,入室と退室の記録の数が合わないという問題が発生していることが分かった。そこで,毎日,入退室記録表を使って,前日の入退室の回数が一致しない社員がいないかどうかを確認することにした。次に示す入退室確認では,前日の日付で,同一区画での入室と退室の回数が一致していないICカード番号を調べる手順を示している。a,bに入れる字句の適切な組合せはどれか。 〔前日の入退室確認〕 (1) 入退室年月日が前日の日付であるレコードを全て取り出し,ICカード番号の昇順で,かつ,区画番号の同じレコードが並ぶように整列する。 (2) (1)で整列したレコードに対して,ICカード番号と区画番号が同じレコードごとに,それらの a し,その結果の値とICカード番号及び区画番号とを併せて表として記録する。 (3) (2)で記録した a した値が b ICカード番号と区画番号を出力する。
平成27年度 春期 ITパスポート試験 問87
この問題の解説と、これまでの解答の記録です。
問 87
※ この問題は、解説作成時の検算で公表解答を確認しきれませんでした。判定は IPA 公表の解答どおりです。
不正解ア
区画番号の値 (1なら1、2なら2) を加算しても、加算される値は区画番号だけで決まり、そのレコードが入室か退室かを一切反映しない。合計は「区画番号 × レコード件数」になるだけで、入室と退室の差とは無関係である。例えば区画番号1の区画で入室2回・退室0回という明らかな不一致でも、合計は2で偶数となり b=「奇数である」に該当せず見逃してしまう。さらに区画番号2の区画では合計が常に 2 × レコード件数 で必ず偶数になるため、その区画ではどんな不一致も一件も抽出できない。加えてビルは10区画あるのに、加算規則が区画番号1と2の場合しか定義されておらず、手順としても成立していない。
- イ
正解 中問Aの前書き〔入退室管理の概要〕(3)で、入退室記録表の入退室区分には入室の場合「1」、退室の場合「−1」を記録すると定められている。したがって手順(2)で、ICカード番号と区画番号が同じレコードごとに入退室区分の値を合計する (集計する) と、その合計は (入室回数)×1 + (退室回数)×(−1) = 「入室回数 − 退室回数」を表す。入室と退室の回数が一致していれば合計はちょうど0になり、一致していなければ0以外の値 (入室が多ければ正、退室が多ければ負) が残る。よって a には「入退室区分の値を合計」、b には「0でない」が入り、手順(3)で合計が0でないICカード番号と区画番号を出力すれば、前日に同一区画で入退室の回数が食い違った社員だけを過不足なく抽出できる。これがイである。合計値の符号と絶対値から、どちらが何回多いかまで分かるのもこの符号付きコード設計の利点である。
不正解ウ
入退室記録表の1レコードは1回の入室または退室のどちらか一方しか保持しておらず、レコード単位で「入室と退室の時刻差」を求めること自体ができないので、a の集計操作が成立しない。条件 b も目的に合っていない。P社は社員に午前0時までの退社を義務づけているので、前日の日付1日分のレコードから求めた同一区画の滞在時間の合計が24時間を超えることは起こりえず、この基準では何も出力されない。そもそも滞在時間の長短は、入退室の回数が合っているかどうかとは別の話である。
不正解エ
レコードの個数を数えて得られるのは「入室回数 + 退室回数」であり、その内訳が入室何回・退室何回なのかは分からない。個数の偶奇では回数の一致・不一致を判定できない。例えば入室2回・退室1回は回数が一致していないのに個数は3で奇数となり、b=「偶数である」に該当しないため抽出されず見逃してしまう。逆に入室1回・退室1回という正常なケースは個数2で偶数となり、出力すべきでないのに大量に出力されてしまう。取りこぼしと誤出力の両方が起きる基準であり、目的に合わない。
- 対になる事象 (入室と退室) を +1 / −1 の符号付き区分コードで記録しておくと、その合計が0か否かだけで過不足を一括判定できる。合計0=対応が取れている、0以外=どちらかが多い、という設計上の定石。
- 集計処理は「整列 → キーの組ごとに集計 → 条件に合う行だけを選択して出力」が基本形で、どの列の組合せでグループ化するかが要点。本問はICカード番号と区画番号の組ごとに集計するため、手順(1)であらかじめICカード番号の昇順かつ同じ区画番号のレコードが並ぶように整列している。