このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の日付セットから「閏年の判定 (paizaランク D 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
西暦yが与えられるので、閏年ならYesを、平年ならばNoを出力してください。
閏年か平年かは次のような条件によって判定することができます。
- 西暦が4で割り切れる年は閏年
- ただし、100で割り切れる年は平年
- ただし、400で割り切れる年は閏年
- 西暦が4で割り切れない年は平年
入力される値
整数yが1行で入力されます。
期待する出力
閏年ならYesをそうでないなら、Noを出力してください。
考え方
率直にやるなら、4つの条件を順番に判断する。割り切れるか否かの判断には剰余( % )を用いる。
しかし、「ただし」という条件があるので、順番に判断する場合には、一度結果を入れる変数を用意しておき、判定によって結果を上書きするような流れとなる。
つまり、
- 西暦が4で割り切れれば閏年 ⇨ 閏年にセット
- ただし、100で割り切れる年は平年 ⇨ 平年にセット
- ただし、400で割り切れる年は閏年 ⇨ 閏年にセット
- ただし、100で割り切れる年は平年 ⇨ 平年にセット
となるので、このパターンだと全て評価を終えるまで結果を表示することはできない。
一方、4つの評価の順番は次のように入れ替えることができる。
- いかなる年でも、400で割り切れれば閏年(400で割り切れる年は必ず4でも割り切れる。また、100で割り切れても400で割り切れれば閏年)
- あるいは、100で割り切れない年で、かつ4で割り切れる年は閏年
このよう入れ替えると、判定年を i とするとき、閏年は次のように記述できる
1 2 3 4 5 |
if i % 400 == 0 || ( i % 100 != 0 && i % 4 == 0 ) { // 閏年 } else { // 平年 } |
解答例
ベタに判定する例だと次の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// 入力される年 let i = Int(readLine()!)! // 結果を入れる変数 var y = "No" if i % 4 == 0 { // 4 で割り切れれば一旦閏年 y = "Yes" if i % 100 == 0 { // しかし、100で割り切れれば一旦平年 y = "No" if i % 400 == 0 { // しかし、400で割り切れれば最終結果は閏年 y = "Yes" } } } print(y) |
評価を入れ替えた場合は次の通り。
1 2 3 4 5 6 7 8 |
// 入力される年 let i = Int(readLine()!)! if i % 400 == 0 || ( i % 100 != 0 && i % 4 == 0 ) { print("Yes") } else { print("No") } |