このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の日付セットから「次の日 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
西暦y年m月d日の次の日を表示してください。
ただし、各月の日数は以下のように決まることに注意してください。
- 4, 6, 9, 11月は30日
- 2月は閏年ならば29日、そうでなければ28日
- それ以外の月は31日
ただし、閏年は次のような年のことをいいます。
- 西暦が4で割り切れる年は閏年
- ただし、100で割り切れる年は平年
- ただし、400で割り切れる年は閏年
入力される値
整数yとmとdが次のように、スペース区切りで1行で入力されます。
1 |
y m d |
期待する出力
以下のような形式で、答えを出力してください。
1 |
a b c |
考え方
与えられた日の次の日を出力すれば良いのでさほど難しくはないが、考慮しなければならないのは次の2点。
- 閏年の判定を行い、2月末日の処理を確実にする。
- 大晦日(12月31日)であれば、年も一つ加算する。
閏年の判定については、下記の記事を参考にしてください。
2月以外で月末が30日までしかない日の判定には、辞書型( Dictionary)を使っています。辞書にあらかじめ 4, 6, 9, 11 をキーとしたデータを与えておき、それを用いて30日判定を行なってみました。
つまり、 m を月数とするとき、
1 2 3 4 5 6 |
// 30日判定用の辞書。value は何でも良い。 var day30 = [4:1, 6:1, 9:1, 11: 1] if let _ = day30[m] { // 4, 6, 9, 11 の各月の計算 } |
このようにコードを記述すれば、月末が30日までの処理を簡単に判断することが可能です。
解答例
もうちょっと簡素化できるかもしれません。
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
// 与えられた文字列を空白で区切り、Int に変換する let ia = readLine()!.split(separator: " ").map { Int($0)! } // 計算しやすいように、配列の各要素を変数に代入しなおす var y = ia[0] var m = ia[1] var d = ia[2] // 動作チェック用 //入力例1 //2019 4 4 -> 2019 4 5 // y = 2019 // m = 4 // d = 4 //入力例2 //2019 4 30 -> 2019 5 1 // y = 2019 // m = 4 // d = 30 //入力例3 //2019 2 28 -> 2019 3 1 // y = 2019 // m = 2 // d = 28 //入力例4 //2020 2 29 -> 2020 3 1 // y = 2020 // m = 2 //d = 29 // 30日判定用の辞書。value は何でも良い。 var day30 = [4:1, 6:1, 9:1, 11: 1] // 閏年判定 func isLeap(_ y: Int) -> Bool { if y % 400 == 0 || ( y % 100 != 100 && y % 4 == 0) { return true } else { return false } } // 月跨ぎの日付を更新 func updateMonth() { m += 1 d = 1 } if let _ = day30[m] { // 4, 6, 9, 11 の各月の計算 d += 1 if d > 30 { updateMonth() } } else if m == 2 { // 2月の計算 if d == 29 { // 2月29日だった時 updateMonth() } else if isLeap(y) { // 閏年だった時 d += 1 } else { // 例年 updateMonth() } } else { // 1, 3, 5, 7, 8, 10, 12 月の計算 d += 1 if d > 31 { // 月末処理 updateMonth() } if m == 13 { // 年末処理 y += 1 m = 1 d = 1 } } // 結果出力 print(y, m, d) |