はじめに
タイトル通りです。下の問題をPythonで解きました。
MaxCounters coding task - Learn to Code - Codility
回答コード
import collections
# Aは空じゃないリスト
# Aの各要素は、1~N+1
def solution(N, A: list):
if (len(set(A)) == 1):
if (A[0] == N+1):
return [0] * N
else:
counters = [0] * N
counters[A[0] - 1] = len(A)
return counters
# Aの中から、要素がN+1の全インデックスを探す
indexs: list = [i for i, x in enumerate(A) if x == N+1]
# 上のリスト内の各インデックスの間で、インクリメント対象カウンター位置の出現回数の最大値を取得
max = 0
prev = 0
current = 0
for current in indexs:
c = collections.Counter(A[prev:current])
c = c.most_common()
# max counter operationが最初に来るときは、cが空になり下で例外を吐く
try:
max += c[0][1]
except:
pass
prev = current + 1
counters = [max] * N
# 上のリスト(要素がN+1の全インデックス)の最後より後の部分で、インクリメント対象カウンター位置の出現回数を取得
c = collections.Counter(A[current+1:])
# 各位置で、上で取得した出現回数分だけ各カウンターをインクリメントする
return [e + c[i+1] for i, e in enumerate(counters)]
上の回答で、
おわりに
就職活動の一環でCodilityの問題を解いているのですが、track.runとは異なり、回答者がテストできるのは評価対象ケースのほんの一部だけで最終的なスコアは回答を終えるまでわからないというのが大変ですね……。
あと、LeetCodeのように回答コードを共有する公式の場所が見つからなかったのでとりあえずQiitaに書いていますが、共有する場所をご存知の方は教えていただけますと幸いです。
おまけ
本番のテストを解いたので、注意点を書いておきます。
- テストがいくつかのtaskに分かれている場合は、それぞれを別々にsubmitしないといけない。一括でsubmitはできない。
- 既存のコードのバグ修正をする形式のtaskは、問題文で示されている変更可能行数を上回る行数を変更してはいけない。