目次
- はじめに
- 問題URL
- HAPPY DAYとは
- 考え方
- 提出コード
- 解説
- おわりに
質問・指摘などがありましたらコメントかTwitterまでお願いします。
はじめに
競技プログラミング練習サイトのyukicoderで簡単な問題として掲載されていたNo.188を解きましたが、正攻法ではない気がしたので備忘録を兼ねて解法を書いておきます。
問題URL
HAPPY DAYとは
問題において定義されている "HAPPY DAY" は、日付をX月Y日として表したとき、Yの数字和 (=各桁の整数の和) がXと等しい日のことを指します。
この問題はグレゴリオ暦2015年について、"HAPPY DAY"が何日あるか求めよ。とのことでしたので、うるう年は考慮しなくて良いです。
考え方
問題文の最後には次のように表記されていました。
365日それぞれの日が成り立つか確認してカウントしても十分速い。
ということで、365日全てにおいて成り立つかどうか確認して求めました。
組み込み関数 divmod()
Pythonにはdivmod()
という組み込み関数があります。
・組み込み関数 — Python 3.9.4 ドキュメント
使用例は以下の通りです。
q, mod = divmod(10, 3)
print(q) #3
print(mod) #1
divmod(a, b)
は(a // b, a % b)
というタプルを返します。上のコードのようにアンパックして取得することができるので、数字和を求めるためにこの関数を使いました。
提出コード
monthl = list(range(1,13))
datel_1 = list(range(1,29)) #2月
datel_2 = list(range(1,31)) #4,6,9,11月
datel_3 = list(range(1,32)) #上記以外の月
res = 0
for i in monthl:
if i == 2:
for j in datel_1:
q, mod = divmod(j,10)
if i == q + mod:
res += 1
elif i == 4 or i == 6 or i == 9 or i == 11:
for j in datel_2:
q, mod = divmod(j,10)
if i == q + mod:
res += 1
else:
for j in datel_3:
q, mod = divmod(j,10)
if i == q + mod:
res += 1
print(res)
実行時間は14ms、使用メモリは7580KBでACでした。
解説
月、日ともにリストを作り、for文で探索しました。月によって日数が28日、30日、31日と違うので、3種類のリストを作成し、月によって探索するリストを変えています。その後、divmod()
で成り立つものを調べて数えました。
おわりに
divmod()
を使って解いている人を見かけなかったのでまとめてみました。
この記事で用いたコードを含め、yukicoderやAtCoderに提出したコードは、Githubにアップロードしています。
・for_yukicoder — Github/PyRadiolarus