array_key_first
:配列の最初のkey を取得する
$keys = array_key_first($rainAll);
- reset(), end() :配列の最初と最後の要素を取得。
reset($resultDays) . ' ' . end($resultDays);
getSumRain():ここが成長を感じた点
平均降水確率を作成する際、合計の降水確率が欲しい。それを別の関数(getSumRain)で求めることにした。
- 考え:旅行の日数分、forループを回す
ただし、$i = 0 で回すと、毎回、$i = 0 に初期化されてループが回るので、意図した合計値を求められない。
getAvgRainsAndDays関数で、$i は、0, 1, 2, ... と足されていくので、それをgetSumRain関数でも連動するように、$count を作った。
$i < $tripDays + $count
上記のように設定した理由は、毎回、旅行日数分ループを回したいが、$i の初期値が getSumRain関数が呼び出されるたびに、$count 分増えるので、同じく、上限値を$count分、毎回増やして対応するっていう意図。
function getSumRain(array $rainAll, int $tripDays, int $dayoffs, int $count): int { $sum = 0; for($i = $count; $i < $tripDays + $count; $i++) { $sum += $rainAll[$i]; } return $sum; } // $tripDays分の平均降水確率とその各日付 の配列 function getAvgRainsAndDays(array $rainAll, int $tripDays, int $dayoffs, array $daysAndRains): array { $rainAvg = []; $avgOfDays = []; // 日付の配列を生成 $daysKey = array_keys($daysAndRains); $count = 0; for ($i = 0; $i < $dayoffs; $i++) { if (($i + $tripDays) <= $dayoffs) { $sum = getSumRain($rainAll, $tripDays, $dayoffs, $count); $count++;
^^^^^^^^^^^^
fscanf(STDIN, "%d %d", $dayoffs, $tripDays); // 休日が、1日の場合 if ($dayoffs === 1) { [$a, $b] = explode(" ", trim(fgets(STDIN))); echo $a . ' ' . $a; die(); } $daysAndRains = []; for($i = 0; $i < $dayoffs; $i++) { [$day, $rain] = explode(" ", rim(fgets(STDIN));); $daysAndRains[$day] = $rain; } // $rainAllは、降水確率だけを格納した配列。 $rainAll = []; foreach ($daysAndRains as $day => $rain) { $rainAll[] = (int) $rain; } // 旅行日数が、1日の場合 if ($tripDays === 1) { asort($rainAll); // 降水確率の最小値のkeyをとりだし、それに該当する日付を取得する $keys = array_key_first($rainAll); $result = reset(array_slice($daysAndRains, $keys, 1)); echo $result . ' ' . $result; die(); } function getSumRain(array $rainAll, int $tripDays, int $dayoffs, int $count): int { $sum = 0; for($i = $count; $i < $tripDays + $count; $i++) { $sum += $rainAll[$i]; } return $sum; } // $tripDays分の平均降水確率とその各日付 の配列 function getAvgRainsAndDays(array $rainAll, int $tripDays, int $dayoffs, array $daysAndRains): array { $rainAvg = []; $avgOfDays = []; // 日付の配列を生成 $daysKey = array_keys($daysAndRains); $count = 0; for ($i = 0; $i < $dayoffs; $i++) { if (($i + $tripDays) <= $dayoffs) { $sum = getSumRain($rainAll, $tripDays, $dayoffs, $count); $count++; $avg = $sum / $tripDays; $rainAvg[] = $avg; // 各平均降水確率の日付を取得し、配列に格納する。 $avgOfDays[] = array_slice($daysKey, $i, $tripDays); } else { return array($rainAvg, $avgOfDays); } } } $avgRainsAndDays = getAvgRainsAndDays($rainAll, $tripDays, $dayoffs, $daysAndRains); list($avgOfRains, $daysOfAvg) = $avgRainsAndDays; // 平均降水確率を昇順に並び替える。ただし、keyを維持したまま。 asort($avgOfRains); // 最初のkeyを取得する $resultOfKey = array_key_first($avgOfRains); $resultDays = $daysOfAvg[$resultOfKey]; echo reset($resultDays) . ' ' . end($resultDays);