基本情報技術者過去問題 平成30年春期 午後問13 について

#問題
次の表計算のワークシート及びマクロの説明を読んで，設問1，2に答えよ。

〔表計算の説明〕
　Z社は現在，表計算ソフトを用いた会議室の予約システムを作成中である。会議室は15室あり，それぞれ一意の会議室番号が振られている。また，収容可能人数(以下，定員という)は同一ではなく，スクリーンがある会議室とない会議室がある。会議室の利用は19時から21時まで可能である。予約システムは，ワークシート"会議室選定"とワークシート"予約リスト"で構成される。

〔ワークシート：会議室選定〕
　はじめに，ワークシート"会議室選定"を作成した。ワークシート"会議室選定"の例を，図1に示す。
![worksheetkaigi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/2a9f715e-232a-24fb-4e36-6a10715e6d91.png)

(1):
セル A2～A16 には，会議室番号が入力されている。セル B2～B16 には，会議室の定員が入力されている。セル C2～C16 には，スクリーンがある会議室であれば"有"が，そうでなければ"無"が入力されている。

(2):
予約したい会議室の条件を，セル A19～E19 に入力する。セル A19 に会議室の利用日を，セル B19 に開始時刻を，セル C19 に終了時刻を入力する。セル D19 には，利用人数を入力する。セル E19 には，スクリーンの利用を希望する場合は"要"を，そうでない場合は"不要"を入力する。終了時刻は開始時刻よりも後でなければならない。日付は YYYYMMDD，時刻は hhmm の形式で表現される整数値である。

(3):
(2)で条件を入力した後，ワークシート"会議室選定"に格納されているマクロ SelectRoom を実行すると，ワークシート"予約リスト"に格納されている予約の一覧を参照し，会議室ごとに，条件に指定した利用日の開始時刻から終了時刻までの間(開始時刻及び終了時刻を含まない)に他の予約が入っていない場合は"可"を，そうでなければ"否"を，セル D2～D16 に格納する。

(4):
セル E2～E16 には，対応する会議室の収容率を求める式が入力されている。ここで収容率は，次の式で求める。

>収容率 = 利用人数 / 定員

ただし，利用人数が定員を超える場合，スクリーンの利用を希望しているのに会議室にスクリーンがない場合，又は当該行の列Dの値が"否"の場合は，収容率は 0 にする。

(5):
セル A22 には，推奨会議室の会議室番号を表示する式が入力されている。ここで，推奨会議室とは，収容率が最も大きな正の値となる会議室である。ただし，この収容率が等しい会議室が複数あるとき，それらの中で表の最も上に位置する会議室番号を表示する。また，条件を満たす会議室がないときには，"なし"を表示する。

〔ワークシート：予約リスト〕
　予約の一覧は，ワークシート"予約リスト"に格納されている。ワークシート"予約リスト"の例を，図2に示す。
![worksheetyoyaku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/4e46287b-d4bb-7c2d-f0e9-0403cc094265.png)

(1):
1件の予約のデータが1行に入力されている。列Aには，予約ごとに一意となる予約IDが格納されている。

(2):
列Bには利用日，列Cには開始時刻，列Dには終了時刻，列Eには利用人数が格納されている。日付は YYYYMMDD，時刻は hhmm の形式で表現される整数値である。

(3):
列Fには，スクリーンの利用を希望する場合は"要"が，そうでない場合は"不要"が格納されている。

(4):
列Gには，予約された会議室番号が格納されている。

(5):
予約のデータは，利用日の昇順に常に整列されている。

(6):
新しい予約のデータを登録するには，ワークシート"予約リスト"に格納されているマクロ Register を実行する。また，予約総数は 9,998 件までとし，データの最終行よりも下の行の列A～Gの各セルには空値が格納されている。

(7):
会議室の予約は9時から21時まで行うことができる。21時を過ぎたら直ちに，ワークシート"予約リスト"に格納されているマクロ Update を実行する。マクロ Update は，利用が終了した予約のデータを予約の一覧から消去するために，その予約のデータの入った行より下の行の予約のデータを上方向に詰める。

(8):
マクロ Register，Update，SelectRoom は，いずれもその実行中に他のマクロが実行されることはない。

##設問2
マクロ SelectRoom 中の □ に入れる正しい答えを、解答群の中から選べ。
![selectroom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/a7929fa5-65ce-7699-885b-06b2f9013f14.png)
d に関する解答群

ア:
論理積(表引き(予約リスト!C2:C10000,J,1)≧C19,
　　表引き(予約リスト!D2:D10000,J,1)≦B19)

イ:
論理積(表引き(予約リスト!C2:C10000,J,1)≦C19,
　　表引き(予約リスト!D2:D10000,J,1)≧B19)

ウ:
論理積(表引き(予約リスト!D2:C10000,J,1)≧C19,
　　表引き(予約リスト!C2:C10000,J,1)≦B19)

エ:
論理積(表引き(予約リスト!D2:C10000,J,1)≦C19,
　　表引き(予約リスト!C2:C10000,J,1)≧B19)

オ:
論理和(表引き(予約リスト!C2:C10000,J,1)≧C19,
　　表引き(予約リスト!D2:D10000,J,1)≦B19)

カ:
論理和(表引き(予約リスト!C2:C10000,J,1)≦C19,
　　表引き(予約リスト!D2:D10000,J,1)≧B19)

キ:
論理和(表引き(予約リスト!D2:D10000,J,1)≧C19,
　　表引き(予約リスト!C2:C10000,J,1)≦B19)

ク:
論理和(表引き(予約リスト!D2:D10000,J,1)≦C19,
　　表引き(予約リスト!C2:C10000,J,1)≧B19)

#設問2 の d の解答を導く
##d が含まれる条件式が真であった場合
d が含まれる条件式が真であった場合に、どんな処理がなされるかを確認します。
![selectroom3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/07ddbdae-ea80-e979-cd26-2e6596117d31.png)
何かに対して、'否'を格納していますね。
e が何であるかはまだ分かっていませんが、下の<font color="red">□</font>で囲った処理に注目すれば何となくわかるでしょう。
![selectroom4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/4042a797-8a2b-dc12-d922-8a45b628e9ac.png)
ワークシート"会議室選定"の使用可否を全て'可'で埋めています。
これらのことから、d が含まれる条件式が真である場合、ワークシート"会議室選定"のある行の使用可否を'否'にしていることが分かります。
##d が含まれる条件式 の 否定 に注目する
下の<font color="red">□</font>で囲った部分にある通り、d が含まれる条件式では、d を否定しています。
![selectroom2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/51b32d38-0f54-323c-00b1-4f51cd78b60f.png)
マクロ:SelectRoom では、使用可否の'否'の判定を、'否'となる条件を満たすかではなく、'可'となる条件を満たさないか、で行っているのです。
このことから、d にはワークシート"会議室選定"の使用可否が'可'となる条件が入ることが分かります。
##各選択肢ごとに考えてみる
###ア:
>論理積(表引き(予約リスト!C2:C10000,J,1)≧C19,
　　表引き(予約リスト!D2:D10000,J,1)≦B19)

予約リスト!C2:C10000には、開始時刻が記入されています。
予約リスト!D2:C10000には、終了時刻が記入されています。
B19 には、開始時刻が記入されています。
C19 には、終了時刻が記入されています。

ちょっとややこしくなってきたので、ここからは図を書いて考えてみましょう。

まず、B19 と C19 を線で表してみましょう。
![b19c19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/3f56a990-3195-0d0c-4c5d-7bbe62b2e701.png)

これに、論理積()内の条件式を当てはめてみます。
一つ目が、表引き(予約リスト!C2:C10000,J,1)≧C19
![yoyakuc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/eb1ccac8-6f85-ae14-5e7e-3cc1426daa38.png)

二つ目が、表引き(予約リスト!D2:D10000,J,1)≦B19)
![yoyakucd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/cde5e861-6b07-4dfc-a50e-275c19bd2bc5.png)

んで、論理積だから、一つ目の条件式も二つ目の条件式も、満たしていなければならないのですが……
そうなると、予約リストの会議室の利用時間は、下のようになることが分かります。
![kekka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/3772d790-f3b5-b876-2d73-4e1ceaae6c12.png)
予約リストともろ被りしてるから、これでは使用可否が'可'となる条件とは言えません。
それに、そもそも終了時刻よりも開始時刻が遅いって時点で既におかしいです。
ありえないことです。

というわけで、アは答えではないということが分かります。

#まとめ
選択肢イ以降については省略します。
アに対してやったことを、他の選択肢に対してもやっていけば解答を導くことができます。