[プログラマー]偽装


偽装プログラマー<Hash>(https://programmers.co.kr/learn/courses/30/lessons/42578 )


問題の説明


スパイたちは毎日違う服を着て自分を偽装している.
例えば、スパイの服が以下のように、今日スパイが丸い眼鏡、長いコート、青いTシャツを着ている場合は、翌日はジーンズを追加したり、黒いサングラスをかけたりして、丸い眼鏡ではありません.
タイプ名
黒墨鏡
上着
ズボン
コート着
スパイが持っている服に二次元配列の服が与えられた場合、異なる服の組み合わせの数を返すために解関数を作成します.

せいげんじょうけん

  • 服装の各行は「服装名、服装種類」からなる.
  • スパイが持っている服の数は1着以上30着以下.
  • のような名前の服は存在しません.
  • アパレルのすべての要素は文字列から構成されています.
  • すべての文字列の長さは、1または20未満の自然数であり、アルファベット小文字または「」のみから構成されます.
  • スパイは毎日少なくとも1枚の服を着ている.
  • I/O例


    clothes
    [["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]
    [["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]]

    I/O例説明


    例1


    headgearに対応した服装は黄色hat、緑turban、眼鏡に対応した服装は青サングラスで、以下の5つの組み合わせが可能です.

    例2


    Faceに対応した服装はcrow mask,blue sunglasse,mocky paskであり,以下の3つの組み合わせが可能である.

    通過コード(Python)

    from collections import Counter
    def solution(clothes):
        c = Counter([a for _, a in clothes])
        cnt = 1
        for key in c:
            cnt *= (c[key] + 1)
        return cnt - 1
    私は後でreduceを知ったので、それを使ってみました.これから勉強します.reduce(집계 함수, 순회 가능한 데이터[, 초기값])
    from collections import Counter
    from functools import reduce
    def solution(clothes):
        c = Counter([a for _, a in clothes])
        answer = reduce(lambda x, y: x*(y+1), c.values(),1)-1
        return answer
    プログラマーは他人のコードを見る楽しみがある.
    同じモジュールのような関数を使っていると、そこまで減ってしまう.
    import collections
    from functools import reduce
    
    def solution(c):
       return reduce(lambda x,y:x*y,[a+1 for a in collections.Counter([x[1] for x in c]).values()])-1