LoginSignup
0
0

More than 1 year has passed since last update.

PythonでCodilityのLesson4 MaxCountersのスコア100%

Last updated at Posted at 2022-10-23

はじめに

 タイトル通りです。下の問題を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)]

上の回答で、

  • Total score: 100%
  • Detected time complexity: O(N + M)
    でした。
    スクリーンショット 2022-10-23 23.48.38.png

おわりに

 就職活動の一環でCodilityの問題を解いているのですが、track.runとは異なり、回答者がテストできるのは評価対象ケースのほんの一部だけで最終的なスコアは回答を終えるまでわからないというのが大変ですね……。
 あと、LeetCodeのように回答コードを共有する公式の場所が見つからなかったのでとりあえずQiitaに書いていますが、共有する場所をご存知の方は教えていただけますと幸いです。

おまけ

 本番のテストを解いたので、注意点を書いておきます。

  1. テストがいくつかのtaskに分かれている場合は、それぞれを別々にsubmitしないといけない。一括でsubmitはできない。
  2. 既存のコードのバグ修正をする形式のtaskは、問題文で示されている変更可能行数を上回る行数を変更してはいけない。
0
0
0

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