Kさんの弟は,この春から初めて自分のスマートフォンを持つ。家族が契約している携帯電話会社には四つの料金プランがあるが,月に使うデータ量によって得になるプランが変わる。そこでKさんは,データ量ごとに料金が最も安いプランを調べることにした。
どのプランにも,毎月必ず支払う基本料と,基本料の範囲で使える含まれるデータ量が決められている。含まれるデータ量を超えて使った月は,超えたデータ量1GBごとに,プランごとに決められた追加単価がかかる。データ量はGB単位の整数で数えることとし,1か月の料金は,次の規則1・規則2で決まる。
| プラン1 | プラン2 | プラン3 | プラン4 | |
|---|---|---|---|---|
| 基本料(円) | 1000 | 2000 | 3000 | 5000 |
| 含まれるデータ量(GB) | 1 | 3 | 7 | 20 |
| 追加単価(円/GB) | 500 | 400 | 300 | 200 |
例えば,ある月に8GBを使ったとすると,プラン2は含まれるデータ量3GBを5GB超えるので,規則2により料金は 2000+5×400=4000円になる。一方,プラン4は8GBが含まれるデータ量20GB以下なので,規則1により料金は基本料の5000円である。
弟の友人たちの話から,弟は毎月5GBほど使うと考えられる。5GBのとき,プラン1の料金は 1000+4×500=3000円,プラン4の料金は5000円である。残りの二つのプランの料金も規則1・規則2で求めて比べると,料金が最も安いのはプランアであることがわかる。
また,プラン3の料金がちょうど6000円になるのは,その月に使ったデータ量がイウGBのときである。
ここでKさんは,二つの規則を一つの式で表すことを考えた。「使ったデータ量−含まれるデータ量」は,規則1の場合は0以下に,規則2の場合は超えたデータ量になる。そこで,どちらの場合も,超過分の料金は「使ったデータ量−含まれるデータ量」と「0」のエに追加単価を掛けた額とすれば,料金はそれに基本料を足した額になる。
Kさんは,使ったデータ量を一つ決めると,料金が最も安いプランの番号とその料金を表示するプログラムを作成した(図1)。最も安いプランが二つ以上あるときは,番号が最も小さいプランを表示する。
(01)〜(03)行目の配列 Kihon,Fukumu,Tanka には,表1の基本料,含まれるデータ量,追加単価をそれぞれ格納する。添字は1から始まり,プランの番号を表す。例えば,Tanka[2] の値はプラン2の追加単価400である。(04)行目では関数「要素数」を用いて,プランの数を変数 kosu に代入している。(05)行目の変数 data は,使ったデータ量(GB)を表す。
Y が [6, 2, 9] のとき,要素数(Y)は3となる。変数 saiyasu には,それまでに調べたプランの料金のうち最も安いものを,変数 yasui にはそのプランの番号を入れる。(06)・(07)行目では,まだどのプランも調べていない状態として,yasui に0を,saiyasu にどの料金よりも大きい100000を代入する。(08)行目からの繰り返しでプランを1番から順に調べ,(09)行目でプラン j の料金を変数 ryoukin に求める。それがそれまでの最も安い料金より安いときだけ,(11)・(12)行目で saiyasu と yasui を新しい値にする。(09)行目の超過分の料金は関数「最大値」を用いて求める。
図1のプログラムを実行すると「8GBのとき:プラン3,3300円」と表示された。また,(05)行目を「data = 3」に変えて実行すると「3GBのとき:プラン1,2000円」と表示され,料金が同じプランがあるときも決まりどおりになった。
Kさんが図1の結果を見せると,母と次のような会話になった。
母:弟のこづかいでは,料金は毎月3500円までしか出せないね。
Kさんは,図1の繰り返しを,データ量 data を変える繰り返しの内側に入れたプログラムを作成した(図2)。変数 yosan は出せる料金の上限を,変数 saidai は上限以内で使える最大のデータ量を表し,(06)行目で saidai を0にしておく。(09)行目は図1の(09)行目と同じ処理である。今回はプランの番号は求めず,最も安い料金だけを求めればよいので,(10)行目では関数「最小値」を用いて saiyasu を新しい値にする。
(⓪は(06)行目と(07)行目の間,①は(07)行目と(08)行目の間,②は(08)行目と(09)行目の間を表す。③は(10)行目と(11)行目の間で,(08)行目からの繰り返しを抜けた後の場所を表す。)
ところが,図2では「saiyasu = 100000」の1行を書き忘れていた。Kさんがこの1行を図2のシの位置に入れて実行すると,「3500円以内で使えるのは8GBまで」と表示された。
母:来月から,プラン3の含まれるデータ量が10GBに増えるそうよ。
Kさんは,1行を入れた後の図2の(02)行目と(07)行目を次のように変えて実行した。このとき,「3500円以内で使えるのはスセGBまで」と表示された。