この記事では
プログラミング学習サービスpaizaラーニングの
スキルチェックレベルアップ問題集をわかりやすく解説します!
プログラミング言語はpythonです。
今回はCランク相当の以下の問題について解説します。
他のレベルアップ問題集の解答と解説も紹介しているのでぜひご参考ください!
またpaizaの各ランクの攻略法は
こちらで詳しく紹介しているので、ぜひご参考ください!
西暦の和暦変換2 (paizaランク C 相当)の解答と解説
今回の問題は「西暦の和暦変換2 (paizaランク C 相当)」です。
問題はこちらからご確認ください。
この問題を解くのに必要な知識は7つです。
- 半角スペース区切りの入力を受け取る
- 元号を判定
- 文字列を結合
- str型からint型に変換
- 数値の大小を判定
- 元年か判定
- 複数の変数を含んだ結果を出力
この記事では、上記の7つの中で
- 元号を判定
- 文字列を結合
- 数値の大小を判定
- 元年か判定
- 複数の変数を含んだ結果を出力
の5つをそれぞれ詳しく解説します。
残りの
については、以下の記事をご参考ください!
元号を判定
まずは「元号を判定」です。
今回の問題では、与えられた日付から元号を判定し条件分岐を行います。
そのためまずは「元号を判定する条件」を考えなければなりません。
今回は入力された日付と元号が変わった日付を
以下のような8桁の数値に変換して
その大小で判定する方法で考えていきます。
- 1926年12月25日 → 19261225
- 2019年5月1日 → 20190501
文字列を結合
次は「文字列を結合」です。
今回の問題では、日付が年 月 日
のように、
半角スペースで区切りで入力されます。
そのため以下の流れで8桁の数値に変換します。
- 「年」「月」「日」を3つの変数に代入する
- 「年」「月」「日」を文字列として結合
- str型からint型に変換
# 各変数に入力を代入
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文については、こちらをご参考ください!
元年か判定
次は「元年か判定」です。
今回の問題では和暦が1年の時に元年
に変換して表示する必要があります。
そのためまずは各元号において和暦の年を求めます。
if date >= 20190501:
# 令和の年に変換
year = int(year) - 2018
elif date >= 19890108:
# 平成の年に変換
year = int(year) - 1988
elif date >= 19261225:
# 昭和の年に変換
year = int(year) - 1925
elif date >= 19120730:
# 大正の年に変換
year = int(year) - 1911
else:
# 明治の年に変換
year = int(year) - 1867
次にif文を使って「元年かどうか」を判定します。
if date >= 20190501:
# 令和の年に変換
year = int(year) - 2018
# 1年の時は元年に変換
if year == 1:
year = "元"
elif date >= 19890108:
# 平成の年に変換
year = int(year) - 1988
# 1年の時は元年に変換
if year == 1:
year = "元"
elif date >= 19261225:
# 昭和の年に変換
year = int(year) - 1925
# 1年の時は元年に変換
if year == 1:
year = "元"
elif date >= 19120730:
# 大正の年に変換
year = int(year) - 1911
# 1年の時は元年に変換
if year == 1:
year = "元"
else:
# 明治の年に変換
year = int(year) - 1867
# 1年の時は元年に変換
if year == 1:
year = "元"
「元年かどうか」の判定は関数を定義するとよりシンプルに書くことができます。
''' 1年の時は元年に変換する関数 '''
def first_year(year):
if year == 1:
year = "元"
return year
if date >= 20190501:
# 令和の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 2018)
elif date >= 19890108:
# 平成の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1988)
elif date >= 19261225:
# 昭和の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1925)
elif date >= 19120730:
# 大正の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1911)
else:
# 明治の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1867)
if文については、こちらをご参考ください!
複数の変数を含んだ結果を出力
最後は「複数の変数を含んだ結果を出力」です。
今回の問題では結果を「(元号)〜年〜年〜日」のように出力します。
そのため複数の変数を含めて、結果を出力しなければなりません。
今回はformat関数を使った方法を使います。
if date >= 20190501:
# 令和の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 2018)
# "令和〜年〜月〜日"と出力
print("令和{}年{}月{}日".format(year, month, day))
elif date >= 19890108:
# 平成の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1988)
# "平成〜年〜月〜日"と出力
print("平成{}年{}月{}日".format(year, month, day))
elif date >= 19261225:
# 昭和の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1925)
# "昭和〜年〜月〜日"と出力
print("昭和{}年{}月{}日".format(year, month, day))
elif date >= 19120730:
# 大正の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1911)
# "大正〜年〜月〜日"と出力
print("大正{}年{}月{}日".format(year, month, day))
else:
# 明治の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1867)
# "明治〜年〜月〜日"と出力
print("明治{}年{}月{}日".format(year, month, day))
format関数を使った出力については、こちらをご参考ください!
西暦の和暦変換2 (paizaランク C 相当)の解答
まとめると「西暦の和暦変換2 (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)
''' 1年の時は元年に変換する関数 '''
def first_year(year):
if year == 1:
year = "元"
return year
if date >= 20190501:
# 令和の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 2018)
# "令和〜年〜月〜日"と出力
print("令和{}年{}月{}日".format(year, month, day))
elif date >= 19890108:
# 平成の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1988)
# "平成〜年〜月〜日"と出力
print("平成{}年{}月{}日".format(year, month, day))
elif date >= 19261225:
# 昭和の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1925)
# "昭和〜年〜月〜日"と出力
print("昭和{}年{}月{}日".format(year, month, day))
elif date >= 19120730:
# 大正の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1911)
# "大正〜年〜月〜日"と出力
print("大正{}年{}月{}日".format(year, month, day))
else:
# 明治の年に変換し、1年の時は元年に変換
year = first_year(int(year) - 1867)
# "明治〜年〜月〜日"と出力
print("明治{}年{}月{}日".format(year, month, day))
今回は「日付を8桁の数値に変換して判定する」という方法を解説しました。
もちろん他にもこの問題を解く方法は、たくさんあると思います。
ぜひ色々な方法で挑戦してみてください!
まとめ
今回はpaizaのレベルアップ問題集の中で
- 西暦の和暦変換2 (paizaランク C 相当)
の解答と解説を紹介しました。
Dランクの問題に比べて、コードが複雑になります。
そのためコードを書き始める前に
頭の中で処理の流れをイメージをしてから書いていくのがおすすめです!
また他のレベルアップ問題集の問題についての解説も、ぜひご参考ください!