各桁の和の求め方いろいろ

f:id:hrksb5029:20210225022431p:plain
2つ数字が与えられて、各桁の和が大きい方の和を出力する問題です。
自分のやり方があまりにいけてなくて、他の方の解答を見て、目から鱗が落ちました。

atcoder.jp

基本方針として100の位と10の位と1の位の数字をそれぞれ求めて合計を出すことを考えます。

例えば、235という数字があったとします。
私の場合100の位の数字は、100で割った商で求めます。
235 // 100 -> 2
ここからがいけてなくて。。。
その後に、元の数字235から200を引きます。235 - 200 = 35
35を10で割った商から10の位を求めて、また35から30を引いて。。。

途中で書きたくなくなるくらいお粗末なやり方だなと思いました。

もっと美しい方法1

各桁を求めて最後に足す方針は同じです。
100の位は100で割った商で求めます。(ここまでは同じ)
10の位は10で割った商から10で割ったあまりを計算して求めます。
235だったら、235 // 10 -> 23
そこから10で割ったあまりは 23 % 10 -> 2

(235 // 10) % 10
# 2

1の位は10で割ったあまりで求めます。

もっと美しい方法2

入力が文字列なので、各文字を整数に変換してそのまま足します。

sum(map(int, '235'))
# 10

最後のやり方は、シンプルで、「あぁそうだよなー」と思いました。

あまり自分のダメさ加減を卑下しても仕方がないので、
こういう細かいことを積み重ねつつ、1つ賢くなったと前向きに考えていこうと思います。