【日付セット】曜日(large) (paizaランク B 相当) 解答例 – PHP編【paiza】
【日付セット】 > 曜日(large) (paizaランク B 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。
非常に大きな日付の曜日を求める問題なのですが、日付が多すぎて今まで使用していた「date()」関数が使用できません。しかし閏年かどうかの判定、規則性を理解し、「date()」関数を使用できる段階にまで処理できれば前回と同じ方法で答えを導くことができます。
解答例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $input = explode(" ",trim(fgets(STDIN))); $year = $input[0]; $month = $input[1]; $day = $input[2]; $counter = 0; if($year > 2200){ $year = 1800 + (($year-1800) % 400); } $time = $year."/".$month."/".$day; $stanp = strtotime($time); $testtime = date("w",$stanp); $array = ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"]; echo $array[$testtime]; ?> |
解答方針
まずこの問題で悩まされるのは「9999999992年」といった非常に大きな年数が問題として与えられることです。これにより「date()」関数が使えないばかりか、タイムスタンプを繰り返し処理で、一日ずつ回すこともできません。ですが閏年と平年には規則性があり、「date()」関数を使える数値に補正することで前回と同じ方法で答えを導きます。もう一度閏年と平年の条件を確認してみましょう。
・ただし、100で割り切れる年は平年
・ただし、400で割り切れる年は閏年
仮に「西暦400年」を基準で考えてみると、「400年」は400で割り切れるので閏年、「500年」は4で割り切れるので閏年のように思いますが、100で割り切れるので平年となります。「600年」、「700年」も同様です。しかし「800年」は400で割り切れるので閏年となります。
このことから考えれることは、閏年の判定は「400年で1周」するということです。例題で「1800年1月1日水曜日」が与えられていますが、400年後の「2200年1月1日」も「水曜日」となります。この法則を利用し、非常に大きな年数を「date()」関数を使用できる範囲に補正します。
|
1 2 3 |
if($year > 2200){ //もし年数が2200より大きかったら… $year = 1800 + (($year-1800) % 400); } |
このコードが年数の補正部分になります。今回は「1800年」を基準にしてみました。
もし年数が「2200より大きかったら、”1800 + (($year-1800) % 400)”に補正しなさい」というコードです。
「2201年」だったら「1801年」として扱う訳です。この方法なら非常に大きな年数を「1800年~2200年」の範囲として扱うことができます。
あとは「date()」と「strtotime()」から曜日を出力すれば完了です。

