この記事では
プログラミング学習サービスpaizaラーニングの
スキルチェックレベルアップ問題集をわかりやすく解説します!
プログラミング言語はpythonです。
今回はCランク相当の問題を解説します。
他のレベルアップ問題集の解答と解説も紹介しているので
ぜひご参考ください!
またpaizaの各ランクの攻略法は
こちらで詳しく紹介しているので、ぜひご参考ください!
西暦の和暦変換 (paizaランク C 相当)の解答と解説
今回の問題は「西暦の和暦変換 (paizaランク C 相当)」です。
問題はこちらからご確認ください。
この問題を解くのに必要な知識は6つです。
- 半角スペース区切りの入力を受け取る
- 元号を判定
- 文字列を結合
- str型からint型に変換
- 数値の大小を判定
- 複数の変数を含んだ結果を出力
この記事では、上記の6つの中で
- 元号を判定
- 文字列を結合
- 数値の大小を判定
- 複数の変数を含んだ結果を出力
の4つについて、それぞれ詳しく解説します。
残りの
は、以下の記事をご参考ください!
元号を判定
まずは「元号を判定」です。
今回の問題では、与えられた日付から元号を判定し条件分岐を行います。
そのためまずは「元号を判定する条件」を考えなければなりません。
今回は入力された日付と元号が変わった日付を
8桁の数値に変換して、その大小で判定する方法で考えていきます。
- 1926年12月25日 → 19261225
- 2019年5月1日 → 20190501
文字列を結合
次は「文字列を結合」です。
今回の問題では日付が年 月 日
のように
半角スペース区切りで入力されます。
そのため以下の流れで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 相当)
の解答と解説を紹介しました。
Dランクの問題に比べて、コードが複雑になります。
そのためコードを書き始める前に
頭の中で処理の流れをイメージをしてから書いていくのがおすすめです!
また他のレベルアップ問題集の問題についての解説も、ぜひご参考ください!