この記事では
プログラミング学習サービスpaizaラーニングの
スキルチェックレベルアップ問題集をわかりやすく解説します!
プログラミング言語はpythonです。
今回はCランク相当の以下の問題を解説します。
他のレベルアップ問題集の解答と解説も紹介しているので
ぜひご参考ください!
またpaizaの各ランクの攻略法は
こちらで詳しく紹介しているので、ぜひご参考ください!
月の日数 (paizaランク C 相当)の解答と解説
今回の問題は「月の日数 (paizaランク C 相当)」です。
問題はこちらからご確認ください。
この問題を解くのに必要な知識は6つです。
- 半角スペース区切りの入力を受け取る
- str型からint型に変換
- 複数の値のどれか一つと同じか判定
- 割り切れるかで条件を課す
- 閏年か判定
- 結果を出力
この記事では、上記の6つの中で
- 複数の値のどれか一つと同じか判定
- 割り切れるかで条件を課す
- 閏年か判定
の3つを詳しく解説します。
残りの
については、以下の記事をご参考ください!
複数の値のどれか一つと同じか判定
まずは「同じ値か判定」です。
今回の問題では入力された年月から、その月の日数を出力するため
- 4月、6月、9月、11月のどれか
- 2月かどうか(閏年かどうかで変わるため)
- 上記以外か
の3つをまず条件分岐しなければなりません。
最初の「4月、6月、9月、11月のどれか」のような
「複数の値のどれか一つと同じか」を判定するときは
リストを使って以下のように条件を課します。
# 30日間の月のリストを定義
month_list = [4, 6, 9, 11]
# month_listにmonthが含まれているかの条件
month in month_list
リストについては、こちらをご参考ください!
そのため入力された月による条件分岐は
if elif else文を使って以下のように書くことが出来ます!
# 入力をint型に変換し、各変数に代入
year, month = [int(x) for x in input().split()]
# 30日間の月のリストを定義
month_list = [4, 6, 9, 11]
# 30日間の月の場合
if month in month_list:
print(30)
# 2月の場合
elif month == 2:
# 31日間の月の場合
else:
print(31)
if文については、こちらをご参考ください!
割り切れるかで条件を課す
次は「割り切れるかで条件を課す」です。
数値が特定の値で割り切れるかを知るには
%
を使って割り算の余りが0
になるかどうかを計算します。
# 余りを計算
result = year % 400
四則演算については、こちらをご参考ください!
うるう年か判定
次は「うるう年か判定」です。
うるう年か判定するには、
以下の3つの条件を課して処理を条件分岐しなければなりません。
400
で割り切れるか100
で割り切れないか4
で割り切れるか
2つ以上の条件での条件分岐ではif elif else文を使用します。
ここで大切なのが条件を課す順番です。
複数の条件分岐を課す時は、
先に「限定的な(狭い)条件」から課すようにしましょう。
今回の問題だと
最も限定的なのが「400
で割り切れるか」
その次に「100
で割り切れないか」
最後が「4
で割り切れるか」です。
# 400で割り切れる場合
if year % 400 == 0:
print(29)
# 100で割り切れる場合
elif year % 100 == 0:
print(28)
# 4で割り切れる場合
elif year % 4 == 0:
print(29)
# その他
else:
print(28)
なぜ「限定的な条件」を先にするのかというと
例えば「100
で割り切れないか」の条件を最初に課した場合を考えます。
# 100で割り切れる場合
if year % 100 == 0:
print(29)
# 400で割り切れる場合
elif year % 400 == 0:
print(28)
# 4で割り切れる場合
elif year % 4 == 0:
print(29)
# その他
else:
print(28)
この場合、「100
で割り切れる」には
当然「400
で割り切れる」も含まれてしまい
800
などの400
の倍数が平年と判定されてしまいます。
そのため必ず「限定的な条件」から課すようにしましょう。
if文については、こちらをご参考ください!
月の日数 (paizaランク C 相当)の解答
まとめると「月の日数 (paizaランク C 相当)」の解答は以下です。
# 入力をint型に変換し各変数に代入
year, month = [int(x) for x in input().split()]
# 30日間の月のリストを定義
month_list = [4, 6, 9, 11]
# 30日間の月の場合
if month in month_list:
print(30)
# 2月の場合
elif month == 2:
# 100で割り切れる場合
if year % 100 == 0:
print(29)
# 400で割り切れる場合
elif year % 400 == 0:
print(28)
# 4で割り切れる場合
elif year % 4 == 0:
print(29)
# その他
else:
print(28)
# 31日間の月の場合
else:
print(31)
今回の問題はDランクでは登場しなかったif文が二重にかかってくる問題でした。
しかしご紹介したように1つずつ条件分岐を丁寧に考えていくと
あまり難しく感じなかったと思います。
ぜひ複雑な問題に出会ったときは
今回のように一つ一つ順番に考えて解いていきましょう!
まとめ
今回はpaizaのスキルチェックのレベルアップ問題集の中で
- 月の日数 (paizaランク C 相当)
の解答と解説を紹介しました。
Dランクの問題に比べて、コードが複雑になります。
そのためコードを書き始める前に
頭の中で処理の流れをイメージをしてから書いていくのがおすすめです!
また他のレベルアップ問題集の問題についての解説も、ぜひご参考ください!