令和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