【At Coder】ABC081A 別解考察

At Coderをはじめまして、早速問題を解き始めています。
なぜ始めたか、については別記事を書いていますので、よければご覧ください。

今回、解いた問題で回答例と実装しているロジックに違いがありました。
それでも100点で通ってはいるのですが、自分の回答が今後も使えるものかどうか気になったので、考察含めて少し深堀りしてみます。

前提

At Coderにはpythonで参加しています。
本気で目指すならC++のほうが実行速度が早い、ということは知識ベースでは知っていますが、ひとまず学習のしやすさを重視してpythonを選びました。

問題

ABC081A - Placing Marbles

すぬけ君は 1,2,31,2,3 の番号がついた 33 つのマスからなるマス目を持っています。 各マスには 0 か 1 が書かれており、マス ii には s_isi が書かれています。すぬけ君は 1 が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。

https://atcoder.jp/contests/abs/tasks/abc081_a

公式回答

https://qiita.com/drken/items/fd4e5e3630d0f5859067#5-%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9%81%B8-10-%E5%95%8F

公式回答はC++なので、同様のロジックでpythonに書き直してみます。

注意)
以下は公式回答を基にhakutatsuがpythonでコーディングし直したものです。

#inputは文字列として処理
input = str(input())

#カウンター用変数をゼロで宣言
counter = 0

#n番目が1かどうか判定
if input[0] == '1':
    counter += 1
if input[1] == '1':
    counter += 1
if input[2] == '1':
    counter += 1
#結果を表示
print(counter)

pythonでは++って書けないので、+= 1としちゃってますが他にいい書き方あるんですかね…
ひとまず、上記で動くことは動いていると思います。

hakutatsuの回答

初回は以下で回答しました。
シンプルに、1を数えれば良いんだよね?ということで文字を一つずつ取り出してリスト型に格納しています。

変数の命名に無駄に悩みました。。
この辺は段々と自分の変数例を作っていくんでしょうね。

input = input()

list_input = list(input)
num_list = [int(i) for i in list_input]

print(num_list.count(1))

考察方針

さて、どちらのコードもこの問題での得点自体は100点です。

各実行結果についてはそれぞれ以下となります。

コード長実行時間メモリ
公式(hakutatsu編)172Byte26ms9100KB
hakutastu112Byte26ms8920KB

(コード長はコメントを省いています)

実行時間的には双方同じですが、メモリが若干hakutatsuの方が少なくて済んでるようです。(うれしい)
この辺はpythonとC++の言語的な特徴の違いか、それともhakutatsu編がショボすぎるだけなのか…

いずれにしろ、他の問題も解いて汎用的な書き方、という観点も意識したいところです。
でもこんなやり方もあるんだなー、というところで学びになりました。

また別解や、惜しい間違いなど発見したら都度更新しようと思います。

おすすめの記事