令和6年科目B 問5 関連商品の度数を算出するプログラム その1

今回はこちらの問題を調査していきます。

注文データから購入された商品の個数を求めるアルゴリズムになります。

式のイメージはこんな感じです。


プログラムを見ていきたいと思います。
大域変数ordersには{{”A”,”B”,”D”},{”A”,”D”},{”A”},{”A”,”B”,”E”},{”B”},{”C”,”E”}}が格納されています。
itemには、Aなどの文字が入ります。
allitemsにはordersに格納している文字列を重複なく格納したものです。
◾︎イメージ
{”A”,”B”,”C”,”D”,”E”}
※allitemsは全ての商品の配列という意味。
otheritemsは、allitemsからitemの値を除いた値を格納しています。
イメージ
{”B”,”C”,”D”,”E”}
整数型のiとitemCountが準備されています。
itemCountには「0」が代入されます。
itemCount=0
整数型配列arrayK{0,0,0,0}が準備されています。
otherItemsの要素数の個数(今回は4個)の配列が用意されています。
同様に、整数型配列arrayM{0,0,0,0}も準備されています。
otherItemsの要素数の個数(4個)の配列を代入
ValueLとmaxL
maxLには-∞が入ります。
文字列型配列order
文字列型relatedItem

「for (orderにordersの要素を順に代入する)」
こちらは、ordersの要素を入れます。
「if(orderのいずれかの要素の値がitemの値と等しい。)」
こちらはitemが「A」。orderは{”A”,”B”,”D”}。
item=Aの値とorderのAが等しいので、
itemCountの値を1増やします。

itemCountは、例えばAという商品が注文された回数をカウントしています。

次のfor文
iを1からotherItemsの要素数(4)まで回します。
「orderのいずれかの要の値がotherItems[1]の値と等しい」
otherItems[1]=B
orderは{”A”,”B”,”D”}
orderのいずれかの要素の値がitemの値と等しい
orderは{”A”,”B”,”D”}
item=A
なので、Aが含まれるためarrayMを1増やします。
arrayM{1,0,0,0}
※arrayMは例えばAの商品と他の商品が同時購入された時に増える値です。
otherItems[1]=B がorderの{”A”,”B”,”D”}に含まれるため、arrayKの要素1を1増やします。
arrayK{1,0,0,0}
※arrayKは例えばAの商品が購入されても購入されなくてもBの商品などが購入されたときに増えるのが、arrayKになります。

1回目終了。
2回目に入ります。

「for(iを1からotherItemsの要素数まで1ずつ増やす)」
今度はiが2になります。
if(orderのいずれかの要素の値がotherItems[i]の値と等しい)
otherItemsの中身が下記でした。
{”B”,”C”,”D”,”E”}
iが2なので、Cと等しい(Cは注文されているか見ます。)
orderは{”A”,”B”,”D”}
見てみるとCは入っていないため、for文を抜けてiが3にCountUPします。

3回目
次はDの値を判定していきます。
「if(orderのいずれかの要素の値がotherItems[i]の値と等しい)」
orderは{”A”,”B”,”D”}
今回Dが含まれています。
「orderのいずれかの要素の値がitemの値と等しい」
これもItem=Aがorderの要素{”A”,”B”,”D”}に含まれるので、
arrayM{1,0,1,0}となります。
◾︎補足
arrayM{0,0,0,0}は、arrayM{B,C,D,E}のカウント

「if(orderのいずれかの要素の値がotherItems[i]の値と等しい)」も満たすので、
Dの部分、arrayK{1,0,1,0}がCountUPされます。

4回目
iを4にCountUP
ただ、4番目の要素Eが無いため、そのままfor文の下に行きます。iが4なのでfor文自体も終了。
外側のendforに行き、新しい要素をordersからorderへ格納。

orderは{”A”,”D”}になります。

1回目
i=1
「if(orderのいずれかの要素の値がitemの値と等しい。)」
今回ItemがAでorder{”A”,”D”}に含まれるため

itemCountを1増やして、itemCount=2にします。
「for(iを1からotherItemsの要素数まで1ずつ増やす)」
i=1にします。
「if(orderのいずれかの要素の値がotherItems[i]の値と等しい)」
otherItems{”B”,”C”,”D”,”E”}
こちらは、order{”A”,”D”}にotherItemsのBが含まれません。
なので、for文を抜けます。

2回目
i=2
otherItems{”B”,”C”,”D”,”E”}
続いては、otherItemsのCが含まれるか見てみます。
こちらもorder{”A”,”D”}に含まれないためfor文を抜けます。

3回目
i=3
otherItems{”B”,”C”,”D”,”E”}
otherItemsのDが含まれるか見てみます。
こちらは、order{”A”,”D”}にotherItemsのDが含まれるため「if(orderのいずれかの要素の値がotherItems[i]の値と等しい)」を満たします。
更に、「if(orderのいずれかの要素の値がitemの値と等しい。)」もorder{”A”,”D”}にitem=Aが含まれるため条件を満たします。
よって、arrayM{1,0,2,0}、arrayK{1,0,2,0}となります。
◾︎補足
arrayM{0,0,0,0}、arrayK{0,0,0,0}は、arrayM{B,C,D,E}、arrayK{B,C,D,E}と同じ意味。

4回目
i=4
otherItemsのEは含まれないため、for文を抜けます。

内側のfor文が終了します。

続いてorder{”A”,}に対して同じように見ていきます。
「if(orderのいずれかの要素の値がitemの値と等しい。)」
こちらは、item=Aとorder{”A”,}が等しいので、itemCountを1増やして、itemCount=3にします。

1回目
i=1
今回otherItems{”B”,”C”,”D”,”E”}がorder{”A”,}に含まれないため、if文のループが4回回って、itemCount=3のままfor文が終了します。

「for (orderにordersの要素を順に代入する)」
続いてorder{”A”,”B”,”E”}を実行します。

「if(orderのいずれかの要素の値がitemの値と等しい。)」
こちらは、item=Aがorder{”A”,”B”,”E”}の中身に含まれるので、itemCountを1増やして、itemCount=4にします。

「for(iを1からotherItemsの要素数まで1ずつ増やす)」
1回目
i=1

「if(orderのいずれかの要素の値がotherItems[i]の値と等しい)」
otherItemsのBが、order{”A”,”B”,”E”}に含まれるか見てみます。
Bは含まれています。
「if(orderのいずれかの要素の値がitemの値と等しい。)」
item=Aが、order{”A”,”B”,”E”}に含まれるか見てみます。
こちらも含まれています。

arrayM{1,0,2,0}からarrayM{2,0,2,0}へカウントアップ
arrayK{1,0,2,0}からarrayK{2,0,2,0}へカウントアップします。

2回目
i=2
otherItemsのCが、order{”A”,”B”,”E”}に含まれるか見てみます。
Cは含まれていないので、何も処理をせず終了します。

3回目
i=3
Dは含まれないため割愛

4回目
i=4
otherItemsのEが、order{”A”,”B”,”E”}に含まれるか見てみます。
「if(orderのいずれかの要素の値がotherItems[i]の値と等しい)」
otherItemsのEが、order{”A”,”B”,”E”}に含まれるので、条件を満たします。
「if(orderのいずれかの要素の値がitemの値と等しい。)」
order{”A”,”B”,”E”}のAがitem=Aと等しいため当てはまります。

arrayM{2,0,2,0}からarrayM{2,0,2,1}へカウントアップ
arrayK{2,0,2,0}からarrayK{2,0,2,1}へカウントアップします。

これで、order{”A”,”B”,”E”}のfor文が終了終わります。

続いてorder{”B”}です。
「if(orderのいずれかの要素の値がitemの値と等しい。)」
こちらは、item=Aと等しくありません。
なので、こちらの条件は満たされません。
itemCount=4のままになります。

1回目
i=1
「if(orderのいずれかの要素の値がotherItems[i]の値と等しい)」
otherItemsのBとorder{”B”}が等しいです。
なのでこの条件は満たされます。

「if(orderのいずれかの要素の値がitemの値と等しい。)」
item=Aとorder{”B”}
今回は、どちらも等しくありません。

おさらいですが、arrayMはAを購入した人がBも購入する。
arrayKは、Aは購入しない場合でもBを購入するでした。
なのでarrayMは{2,0,2,0}のまま
arrayKは{2,0,2,1}からarrayK{3,0,2,1}へカウントアップします。

i=2~4
otherItems{”B”,”C”,”D”,”E”}の残りがC、D、Eなので今回は処理は実行されず、for文を抜けorder{”B”}の処理は終わります。

最後にorder{”C”,”E”}を呼び出します。
「if(orderのいずれかの要素の値がitemの値と等しい。)」
こちらは、order{”C”,”E”}にitem=Aが含まれません。
なので、itemCount=4のままです。
1回目
i=1
「if(orderのいずれかの要素の値がotherItems[i]の値と等しい)」
otherItemsのBはorder{”C”,”E”}には含まれません。
なので、処理を抜けます。

2回目
i=2
「if(orderのいずれかの要素の値がotherItems[i]の値と等しい)」
otherItemsのCはorder{”C”,”E”}に含まれます。
なので条件を満たします。
「if(orderのいずれかの要素の値がitemの値と等しい。)」
ただ、item=Aはorder{”C”,”E”}に含まれません。
なのでarrayMは{2,0,2,0}のまま
arrayKは{3,0,2,1}からarrayK{3,1,2,1}へカウントアップします。

3回目
i=3
otherItemsのDは含まれないため、処理が実行されず次に進みます。

4回目
i=4
if(orderのいずれかの要素の値がotherItems[i]の値と等しい)」
otherItemsのEはorder{”C”,”E”}に含まれます。
なので条件を満たします。
「if(orderのいずれかの要素の値がitemの値と等しい。)」
item=Aはorder{”C”,”E”}に含まれません。
arrayKを{3,1,2,1}からarrayK{3,1,2,2}へカウントアップします。

これで一通りの処理が終わりました。

引用元
https://www.ipa.go.jp/shiken/mondai-kaiotu/sg_fe/koukai/eid2eo0000007g1d-att/2024r06_fe_kamoku_b_qs.pdf

いいなと思ったら応援しよう!