LoginSignup
0
0

More than 3 years have passed since last update.

AtCoderを始めて1か月経過

Posted at

注意

単なる雑談。有用なことは書かないので了解願う。

1オリジン問題

慣れないPythonながらなんとか茶色になった。時間制限の中で書くのに慣れず相変わらずしょうもないミスをしてDまで解けないことが多い。
そんな中、問題の性質として配列操作が多く、問題ではiが1~Nで定義されているが単純に以下のように処理すると0オリジンになってしまう。
iが直接意味を持つため、1オリジン化しないと処理出来ない。

a = list(map(int,input().split())
for i in range(1,n+1): # 1 to n
    if( i%3==0 ):
        ans += a[i-1] # 0オリジンアクセス

このベース変換はソース上に無限に増えていくので非常に煩わしくバグの原因になる。(というかなった)
というわけで配列の方を1オリジン化することにした。

a = [0]
a.extend( list(map(int,input().split()) )
for i in range(1,n+1): # 1 to n
    if( i%3==0 ):
        ans += a[i] # 1オリジンアクセス

例ではextendでやったが、先頭に[0]をinsertしても同じである。
メモリ再配置がどのみち起きるので、どちらでもよいと思う。
これによって、添え字の-1を忘れるなどのミスが消えた。
Pythonの文字列をまとめてリスト化出来てしまう高機能さが、逆に処理しにくくしていた例である。

アルゴリズムの実装では、添え字操作がメインになるので、+1や-1を繰り返していると何がなんだかわからなくなってしまう。
だったら分かるような状態を無理矢理にでも作ればよい。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0