このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の日付セットから「月の日数 (paizaランク C 相当) 」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
西暦y年m月の月の日数を計算して表示してください。
ただし、各月の日数は以下のように決まることに注意してください。
- 4, 6, 9, 11月は30日
- 2月は閏年ならば29日、そうでなければ28日
- それ以外の月は31日
ただし、閏年は次のような年のことをいいます。
- 西暦が4で割り切れる年は閏年
- ただし、100で割り切れる年は平年
- ただし、400で割り切れる年は閏年
入力される値
整数yとmが次のように、スペース区切りで1行で入力されます。
1 |
y m |
期待する出力
答えの数値を1行で出力してください。
考え方
月の日数を求めることはそれほど難しくないが、閏年の計算をおこなわなければいけない点に注意。
これは、過去問で閏年の計算を行っているため、それを流用する。
閏年の計算がよく使われるのであれば、Code snipets としいて登録しておくのも一つの方法。
今回は関数にすることで、コードの見通しをよくした。
2月、4月、6月、11月の判定には条件式を並べてもいいが、ここでは辞書型を使い判断することにした。辞書のキーを月数とし、登録されている、つまり辞書の検索結果が nil でなければ 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 |
// 一行入力し、配列に入れる let ia = readLine()!.split(separator: " ").map { Int($0)! } // 閏年判定は関数にする func isLeap(_ y: Int) -> Bool { if y % 400 == 0 || ( y % 100 != 100 && y % 4 == 0) { return true } else { return false } } // 4 , 6, 9, 11 月を辞書に登録。 var m = [4:1, 6:1, 9:1, 11:1] if let _ = m[ia[1]] { // 辞書に登録されている月であれば、30を出力 print(30) } else if ia[1] == 2 { // 2月は閏年判定の結果次第 print(isLeap(ia[0]) ? 29 : 28) } else { // その他の月は31日 print(31) } |