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

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

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

この記事では

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

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

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

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

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

ぜひご参考ください!

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

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

スポンサーリンク

西暦の和暦変換 (paizaランク C 相当)の解答と解説

今回の問題は「西暦の和暦変換 (paizaランク C 相当)」です。

問題はこちらからご確認ください。

西暦の和暦変換 (paizaランク C 相当)

この問題を解くのに必要な知識は6つです。

必要な知識
  • 半角スペース区切りの入力を受け取る
  • 元号を判定
  • 文字列を結合
  • str型からint型に変換
  • 数値の大小を判定
  • 複数の変数を含んだ結果を出力

この記事では、上記の6つの中で

  • 元号を判定
  • 文字列を結合
  • 数値の大小を判定
  • 複数の変数を含んだ結果を出力

の4つについて、それぞれ詳しく解説します。

残りの

は、以下の記事をご参考ください!

元号を判定

まずは「元号を判定」です。

今回の問題では、与えられた日付から元号を判定し条件分岐を行います。

そのためまずは「元号を判定する条件」を考えなければなりません。

今回は入力された日付と元号が変わった日付を

8桁の数値に変換して、その大小で判定する方法で考えていきます。

日付を数値に変換
  • 1926年12月25日 → 19261225
  • 2019年5月1日  → 20190501

文字列を結合

次は「文字列を結合」です。

今回の問題では日付が年 月 日のように

半角スペース区切りで入力されます。

そのため以下の流れで8桁の数値に変換します。

8桁の数値に変換する流れ
# 各変数に入力を代入
year, month, day = input().split()

# 文字列として結合し、int型に変換
date = int(year + month + day)

文字列の結合については、こちらをご参考ください!

数値の大小を判定

次は「数値の大小を判定」です。

実は、上記の入力された日付の変換には1つ問題点があります。

それは「月や日が10より小さい時、桁数が8桁にならない」です。

''' 2000年1月1日の場合 '''

# "2000 1 1"と入力
year, month, day = input().split() 

# 200011となってしまう
date = int(year + month + day)

そのため入力された「月」と「日」が10より小さいかを判定し

if文を使って、10より小さい場合はそれぞれの前に0を結合します。

# 各変数に入力を代入
year, month, day = input().split()

# 0を付け足すための変数を定義
new_month = month
new_day = day

# monthが10より小さい時に前に0を結合
if int(month) < 10:
    new_month = "0" + month

# dayが10より小さい時に前に0を結合
if int(day) < 10:
    new_day = "0" + day

# 文字列として結合し、int型に変換
date = int(year + new_month + new_day)

ここで新しく変数を定義したのは

結果を出力する時に0の結合されていない「月」と「日」を使うためです。

ここまでで、入力された日付を8桁の数値に変換することが出来ました。

次に元号が変わった日付の数値と比較して元号を判定し

if elif else文で以下のように条件分岐を行います。

# 令和の場合
if date >= 20190501: 
   
# 平成の場合 
elif date >= 19890108:
    
# 昭和の場合
elif date >= 19261225:
    
# 大正の場合
elif date >= 19120730:
    
# 明治の場合
else:

複数の条件を課す場合には、課す順番に注意しましょう!

if文については、こちらをご参考ください!

複数の変数を含んだ結果を出力

最後は「複数の変数を含んだ結果を出力」です。

今回の問題では結果を(元号)年〜年〜日のように出力します。

そのため複数の変数を含めて、結果を出力する必要があります。

今回はformat関数を使った方法を使います。

if date >= 20190501: 
    # "令和年〜月〜日"と出力
    print("令和年{}月{}日".format(month, day))

elif date >= 19890108:
    # "平成年〜月〜日"と出力
    print("平成年{}月{}日".format(month, day))

elif date >= 19261225:
    # "昭和年〜月〜日"と出力
    print("昭和年{}月{}日".format(month, day))

elif date >= 19120730:
    # "大正年〜月〜日"と出力
    print("大正年{}月{}日".format(month, day))

else:
    # "明治年〜月〜日"と出力
    print("明治年{}月{}日".format(month, day))

format関数を使った出力については、こちらをご参考ください!

西暦の和暦変換 (paizaランク C 相当)の解答

まとめると「西暦の和暦変換 (paizaランク C 相当)」の解答は以下です。

# 各変数に入力を代入
year, month, day = input().split()

# 0を付け足すための変数を定義
new_month = month
new_day = day

# monthが10より小さい時に前に0を結合する
if int(month) < 10:
    new_month = "0" + month

# dayが10より小さい時に前に0を結合する
if int(day) < 10:
    new_day = "0" + day

# 文字列として結合し、int型に変換
date = int(year + new_month + new_day)

if date >= 20190501: 
    # "令和年〜月〜日"と出力
    print("令和年{}月{}日".format(month, day))

elif date >= 19890108:
    # "平成年〜月〜日"と出力
    print("平成年{}月{}日".format(month, day))

elif date >= 19261225:
    # "昭和年〜月〜日"と出力
    print("昭和年{}月{}日".format(month, day))

elif date >= 19120730:
    # "大正年〜月〜日"と出力
    print("大正年{}月{}日".format(month, day))

else:
    # "明治年〜月〜日"と出力
    print("明治年{}月{}日".format(month, day))

今回は「日付を8桁の数値に変換して判定する」という方法を解説しました。

もちろん他にもこの問題を解く方法は、たくさんあると思います。

ぜひ色々な方法で挑戦してみてください!

スポンサーリンク

まとめ

今回はpaizaのスキルチェックの練習問題の中で

  • 西暦の和暦変換 (paizaランク C 相当)

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

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

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

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

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

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

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