タイトル通り、paizaのPHP Bクラス 日別訪問者数の最大平均区間を自力で何とかクリアしたのですが
PHPは解答コードがなかったため、自力でやるしかなく足りない頭がパンクしました。笑
もっとスマートな書き方があるとは思いますが、
初学者の方などの参考になればと思いますのでよろしくお願いします。
問題文はこちらから確認してください。
https://paiza.jp/works/mondai/skillcheck_archive/max_range
コードの記入はpaiza.ioを利用して、入力などを行ってます。
paiza.io:https://paiza.io/ja/projects/new
ではコードを書いていきます!
###1.入力値を求める
[$n, $kya] = explode(' ', trim(fgets(STDIN)));
$log = explode(' ', trim(fgets(STDIN)));
$nには全n日分の日数、$kyaにはキャンペーンを行った日数がわかります。
$logにはn日分の一日分の閲覧数の値が入ります。
paiza内の入力例1を入力した場合、下記のような値が入っています。
array(5) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
[3]=>
string(1) "2"
[4]=>
string(1) "1"
}
###2.キャンペーン期間中の平均値を出す
for ($i = 0; $i < $n - $kya + 1; $i++) {
$log_kya = 0;
// $kya期間の閲覧数の合計を出す(n日期間中)
for ($j = $i; $j < $kya + $i; $j++) {
$log_kya += $log[$j];
}
// 平均値を出し、四捨五入した値を新しい配列$aveに代入する
$ave[] = round($log_kya / $kya, 2);
}
キャンペーン期間($kya)の平均値を出すのですが、まずキャンペーン期間の連続する値を取る範囲を決めます。
for ($i = 0; $i < $n - $kya + 1; $i++) {
}
こうすることで0から始まる配列を3つづつ値をとっても配列数を上回るのを防いでいます。
例の場合
[0] から 3つ 1 2 3
.
.
[3] から 3つ 2 1 ?
となるのを防いでいます。+1は配列は0スタートなので帳尻を合わせるためにしています。
次に繰り返し処理で$kya期間の閲覧数の合計を出す処理をします。
私はここでかなり迷走してました
1日目から3日分、2日目から3日分という処理の仕方がわからなかったのですが、下記のように記述することで解決できました。
上手く説明できる気がしなかったのでここは頑張って理解できるようにしてください。
forの処理がどのように行われているのかを理解しているとわかると思いますが、あまりわからない方は参考にこちらをご覧になってみてください。
参考:https://qiita.com/dogennmosenn/items/8acf35866f24ead0d126
for ($i = 0; $i < $n - $kya + 1; $i++) {
$log_kya = 0;//初期化
// $kya期間の閲覧数の合計を出す(n日期間中)
for ($j = $i; $j < $kya + $i; $j++) {
$log_kya += $log[$j];
}
}
あとは平均値を出します。
for ($i = 0; $i < $n - $kya + 1; $i++) {
$log_kya = 0;//初期化
// $kya期間の閲覧数の合計を出す(n日期間中)
for ($j = $i; $j < $kya + $i; $j++) {
$log_kya += $log[$j];
}
// 平均値を出す
$ave[] = round($log_kya / $kya, 2);
}
ここまでがわかるとあとはかなり楽になると思いますので是非自力でチャレンジしてみてください!
残りは後半で書かせていただきます!