【paiza】 スキルチェック過去問題セット:日別訪問者数の最大平均区間 (paizaランク B 相当) 解答例 – PHP編
この問題はpaiza動画講座の「スキルチェック入門編」 > 「スキルチェック入門編2:日別訪問者数の最大平均区間 (Bランク) (全4回) 」で解説されています。今回はこの解説に沿って解いてみたコード例になりますので詳しい解説は動画からお願いします(少し違うかもしれないけど…
解答例
|
1 |
<!--?php $input_line = explode(" ",trim(fgets(STDIN))); //標準入力で必要な情報を取得 $days = $input_line[0]; //記録されている日数n日 $kyan = $input_line[1]; //キャンペーン期間k日 $alldaysper = explode(" ",trim(fgets(STDIN))); //記録されている各日の訪問者数 $averagebox = array(); // $stoppoint = $days - $kyan + 1; //全ての日数からキャンペーン期間日数を引いて、ループ処理修了ポイントを作る for($i =0;$i < $stoppoint;$i++){ //「$stoppoint」の回数、以下の処理を行う。 $sumper =0; //k日間の人数を測る為の変数「$sumper」を初期化する for($j =0; $j < $kyan;$j++){ //k日間分以下の処理を繰り返す $sumper += $alldaysper[$j+$i]; //「$sumper」に来客数をプラスしていく(この処理がk日分繰り返される } $averagebox[] = $sumper/$kyan; //k日分訪れた客数をk日で割り、一日の平均来客数を「$averagebox」に入れる } $max = max($averagebox); //「$averagebox」から一番大きな(一日の平均来客数が多い)値を取り出す $maxcounter = 0; //キャンペンーン期間の候補数をカウントする変数 foreach($averagebox as $value){ if($value == $max){ $maxcounter++; //配列内で一番大きな数値が現れた時、「$maxcounter」を一つ増やす } } $kyannum = array_search($max,$averagebox)+1; //配列内で一番大きな値が、一番早く表れるインデックスキー $ans = $maxcounter." ".$kyannum; //キャンペーンの候補日数と、候補の中で一番早い日 echo $ans; //答えを出力する ?--> |
同じ処理を2日目から…3日目からと繰り返していき、その中で一番大きな値がキャンペーンの候補となります。
この繰り返し処理をする上で、何回分処理すればいいかは「総日数(n日) – キャンペーン期間(k日)」で求めることができます。
更に二重ループでキャンペーン期間分の来場者数を取得すれば、一日の平均来場者数が求められ、それを配列に入れていけばOKです。
ただしこの方法は「スキルチェック過去問題セット」最後の問題、「日別訪問者数の最大平均区間(large) 」には使えないので注意してください。
