このページについて

このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。

見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。

挑戦する課題

レベルアップ問題集日付セットから「曜日(large) (paizaランク B 相当) 」を取り上げます。

以下は、問題公開 Web ページからの引用です。

問題

西暦y年m月d日が何曜日か表示してください。

ただし、yとして非常に大きな値が与えられる可能性があることに注意してください。

ただし、各月の日数は以下のように決まることに注意してください。

  • 4, 6, 9, 11月は30日
  • 2月は閏年ならば29日、そうでなければ28日
  • それ以外の月は31日

ただし、閏年は次のような年のことをいいます。

  • 西暦が4で割り切れる年は閏年
  • ただし、100で割り切れる年は平年
  • ただし、400で割り切れる年は閏年

ただし、1800年1月1日は水曜日です。

参考: ツェラーの公式#フェアフィールドの公式

入力される値

整数yとmとdが次のように、スペース区切りで1行で入力されます。

期待する出力

以下のような形式で、答えを出力してください。

  • aは”月”, “火”, “水”, “木”, “金”, “土”, “日”のいずれかの文字です。

条件

すべてのテストケースにおいて、以下の条件をみたします。

  • 1800≦y≦10^11
  • 1≦m≦12
  • 1≦d≦31
  • y年m月d日は実際に存在する日付です。(2019年2月31日のような存在しない日付は与えられません)

考え方

この問題は、前問「曜日 (paizaランク B 相当)」をフェアフィールドの公式で解いたのであれば、それをそのまま使い回すことが可能な問題である。

曜日 (paizaランク B 相当)

この問題で気をつけなければならないのは、入力値の範囲である。
改めて条件を見ると

すべてのテストケースにおいて、以下の条件をみたします。

  • 1800≦y≦10^11

という条件がある。 y が取りうる値の上限値が 10^11 乗となっているが、もし1800年からの経過日数を逐一計算して求めているようであれば、仮に計算結果が正しくとも時間切れとなってしまう。

設問にも「フェアフィールドの公式」へのリンクが準備されているので、それを利用しない方法はない。

解答例