【日付セット】連休を伸ばす1 (paizaランク B 相当) 解答例 – PHP編【paiza】


【日付セット】 > 連休を伸ばす1 (paizaランク B 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。

個人的にかなり難しい問題でした。どうすれば結果を導けるのかと考え続けて数時間のたうち回ってた記憶がありますw;

こういう考え方ができればプログラムも楽しくなってくるんだろうなぁ。

解答例

解答方針

ポイントは「function holiday」の中です。このコード中が、「ある始点から何連休になるか」という検証プログラムになっています。この問題では連続するN日に対し、L日分の有休を使うことができるとあります。これはすなわち営業日を表す値「0」を休日を表す値「1」にすることができると考えることができます。「入力例2」を例として確認してみましょう

入力例2:7日の内、有休が1日分使用できる

・始点を一日目

一日目は休日である「1」が入ってるので「連休+1」となります。二日目は営業日である「0」ですが、有休を一回使うことができるので「1」として扱い、「連休+2」となります。三日目は有休ももう使えず、「0」なのでここで処理を中断させ、「連休は2日」となります。

・始点を二日目

2日目を始点と考えた場合、二日目は「0」ですが有休を使えるため「連休+1」となります。しかし三日目はもう有休を使えないため「連休+1」で処理は中断します。

 

このような処理をN回繰り返し、最も連休数が大きいものを更新していき答えを導いていきます。

 

各情報を取得する

各情報を取得する部分になります。

 

連休を検証するプログラム部分

「function」機能であらかじめ連休検証プログラムを作成しています。後に「$n」回分、この処理が実行され、一番大きい値が最大連休として保存されることになります。
複雑に見えますが、検査日が「1」ならば「$one」が一つ増加し、「0」ならば「$zero」が一つ増加するシンプルなプログラムです。検査日「$i」日を始点として、有休が使えなくなった状態で「0」に当たるか、「$n」まで処理が終わったら終了するようになっています。そして処理終了後、「$one + $zero」が始点検査日からの連休となります。

 

N回、連休検査プログラムを動作させ、最大値を更新、出力する

上記の連休検査プログラムをN回繰り返し、最大値を「$counter」に入れ更新していきます。処理終了後、echoで出力すれば答えを導けます。

エッグ

シェアする