[プログラマー]不良ユーザー(Pythonプール)


これはプログラマーがアップロードしたKACA 2019実習生の3つの問題です.
https://programmers.co.kr/learn/courses/30/lessons/64064
質問は上記のサイトを参考にしていますが、質問を読む上で重要だと思う部分は以下の通りです.
Problem Point
  • 不良ユーザIDには、1つ以上の"*"文字が含まれています.
  • トピックのIDリストを取得した場合、これらのIDの順序にかかわらず、IDリストの内容が同じであれば、それを同一と見なし、一括して計算することができる.
  • 不良ユーザーのアイデンティティ値がすべて「*」で構成されている場合、文字数が同じであれば、場合によっては数字に含まれることがあり、順序にかかわらず、アイデンティティリストの内容が同じであれば、同じように処理されるので、set値を比較し、同じ値が含まれていれば追加しません.
    に答える
    最初のアクセスでは、無効id値に一致するuser id値を見つけようとし、各数に乗じた値や無効id値のうち最大値が結果値となるルールを見つけようとしたが、無効idでは重複するuser idを処理するのが難しいため断念した.
    最初は2つ目の条件が見えて順番がなかったので、どちらかのプレイヤーを取ったときにcombinationを使いたかったのですが、プレイヤーの順番によって、含まれる結果値が順番だけでなく中身も違うことが分かったので、順番を含むpermutationを使うことにしました.
    また,無効化されたid表現の形状はPythonを学習する際に一時的に学んだ正規表現と似ているため,정규식を用いてuser id値と無効化されたid値をマッチングした.正規表現を使用する前に、「*」文字を使用します.文字に変えて、正規の儀式に直接使うことができます.
    記入した正規表が少し不足しているので、前の点が正しいし、後に付けた字もチェックされるので、文字数制限も与えられています.
    正規表現が分からないと言ったら、user idの文字数に基づいてインデックスにアクセスして同じかどうかを判断することができます.
    最終回答
    from itertools import permutations
    import re
    
    
    def isMatch(user_id, ban_id):
        for i in range(len(ban_id)):
            p = re.compile(ban_id[i])
            if not p.match(user_id[i]) or len(user_id[i]) != len(ban_id[i]):
                return False
        return True
    
    
    def solution(user_id, banned_id):
        ban_id = []
        answer = []
        for i in banned_id:
            b = i.replace('*', '.')
            ban_id.append(b)
        for i in permutations(user_id, len(ban_id)):
            if isMatch(i, ban_id):
                i = set(i)
                if i not in answer:
                    answer.append(i)
        return len(answer)