長期投資シミュレーションツール『Tousimu』をリリースしました!

【解答付き】paizaスキルチェックの日付セット「月の日数(Cランク)」を解説!

プログラミング
スポンサーリンク

この記事では

プログラミング学習サービスpaizaラーニング

スキルチェックレベルアップ問題集をわかりやすく解説します!

プログラミング言語はpythonです。

今回はCランク相当の以下の問題を解説します。

他のレベルアップ問題集の解答と解説も紹介しているので

ぜひご参考ください!

またpaizaの各ランクの攻略法は

こちらで詳しく紹介しているので、ぜひご参考ください!

スポンサーリンク

月の日数 (paizaランク C 相当)の解答と解説

今回の問題は「月の日数 (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 相当)

の解答と解説を紹介しました。

Cランクの問題からは必ずif文またはfor文が登場し

Dランクの問題に比べて、コードが複雑になります。

そのためコードを書き始める前に

頭の中で処理の流れをイメージをしてから書いていくのがおすすめです!

また他のレベルアップ問題集の問題についての解説も、ぜひご参考ください!

タイトルとURLをコピーしました