このページについて

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

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

挑戦する課題

レベルアップ問題集日付セットから「翌営業日 – その1 (paizaランク C 相当)」を取り上げます。

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

問題

M月D日d曜日の翌営業日の日付を表示してください。

営業日には、次のルールがあります。

  • 営業日は、月曜日から金曜日とし、休業日は、土曜日と日曜日とします。
  • 休業日は土曜日と日曜日のみです。例えば、祝日の「海の日」は月曜日ですが、営業日とします。

日付には、次のルールがあります。

  • 全ての年の2月28日の翌日は、3月1日とします。うるう年は考慮しません。

入力される値

整数MとD、英文字列dが次のように、スペース区切りで1行で入力されます。

期待する出力

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

条件

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

  • 1 ≦ M ≦ 12
  • 1 ≦ D ≦ 31
  • dは、”SUN”, “MON”, “TUE”, “WED”, “THU”, “FRI”, “SAT”の7つの英文字列のうち、1つが入力されます。

考え方

これまでの問題のように、公式を使わなければいけないほどの問題ではないので、それほど難しく考える必要はない。

まずは、変則的な月末日の計算を簡単にするため、月末日計算用の辞書を作る。
また、曜日の文字列が条件に与えられているため、それを使って翌営業日辞書も作る。

月末日の計算は nil 合体演算子( ??)を使って求めているが(辞書に登録されていない日数を代入したら nilが返るため)、あらかじめ月末31日も辞書( d30)に登録しておいても良い。

次に、現在の日付に翌営業日を加算し、それが月末日を超えているようであれば、現在の日付から加算した月末日分を引き、月数を1つ加算する。月数が13月であれば1月に戻す。

解答例