このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の日付セットから「翌営業日 – その1 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
M月D日d曜日の翌営業日の日付を表示してください。
営業日には、次のルールがあります。
- 営業日は、月曜日から金曜日とし、休業日は、土曜日と日曜日とします。
- 休業日は土曜日と日曜日のみです。例えば、祝日の「海の日」は月曜日ですが、営業日とします。
日付には、次のルールがあります。
- 全ての年の2月28日の翌日は、3月1日とします。うるう年は考慮しません。
入力される値
整数MとD、英文字列dが次のように、スペース区切りで1行で入力されます。
1 |
M D d |
期待する出力
以下のような形式で、答えを出力してください。
1 |
A月B日 |
条件
すべてのテストケースにおいて、以下の条件をみたします。
- 1 ≦ M ≦ 12
- 1 ≦ D ≦ 31
- dは、”SUN”, “MON”, “TUE”, “WED”, “THU”, “FRI”, “SAT”の7つの英文字列のうち、1つが入力されます。
考え方
これまでの問題のように、公式を使わなければいけないほどの問題ではないので、それほど難しく考える必要はない。
まずは、変則的な月末日の計算を簡単にするため、月末日計算用の辞書を作る。
また、曜日の文字列が条件に与えられているため、それを使って翌営業日辞書も作る。
月末日の計算は nil 合体演算子( ??)を使って求めているが(辞書に登録されていない日数を代入したら nilが返るため)、あらかじめ月末31日も辞書( d30)に登録しておいても良い。
次に、現在の日付に翌営業日を加算し、それが月末日を超えているようであれば、現在の日付から加算した月末日分を引き、月数を1つ加算する。月数が13月であれば1月に戻す。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// 一行を入力し、空白で区切り、文字列にする let sa = readLine()!.split(separator: " ") .map { String($0) } // 使いやすいように、変数に再代入する var m = Int(sa[0])! var d = Int(sa[1])! var w = sa[2] // 月末日数辞書を作る var d30 = [2: 28, 4:30, 6: 30, 9: 30, 11: 30] // 翌営業日の辞書 var nd = ["SUN": 1, "MON": 1, "TUE": 1, "WED":1 , "THU": 1, "FRI": 3, "SAT": 2] // 月末日の計算。辞書でやってしまっても良い。 let ld = d30[m] ?? 31 // 入力された曜日にあわせて翌営業日を計算 d += nd[w]! // 翌営業日が月末を超えていた場合 if d > ld { // 日付を 1 に戻して(加算した分を引く)、月数を増やす d -= ld m += 1 } // 13月だったら1月にする if m > 12 { m -= 12 } print("\(m)月\(d)日") |