Algorithm🧶 | に見せかける


https://programmers.co.kr/learn/courses/30/lessons/42578
問題の説明
スパイたちは毎日違う服を着て自分を偽装している.
例えば、スパイの服が以下のように、今日スパイが丸い眼鏡、長いコート、青いTシャツを着ている場合は、翌日はジーンズを追加したり、黒いサングラスをかけたりして、丸い眼鏡ではありません.
顔が丸いメガネ、黒いサングラスに青いTシャツのジーンズコートロングコート
スパイが持っている服に二次元配列の服が与えられた場合、異なる服の組み合わせの数を返すために解関数を作成します.
せいげんじょうけん
  • 服装の各行は「服装名、服装種類」からなる.
  • スパイが持っている服の数は1着以上30着以下.
  • のような名前の服は存在しません.
  • アパレルのすべての要素は文字列から構成されています.
  • すべての文字列の長さは、1または20未満の自然数であり、アルファベット小文字または「」のみから構成されます.
  • スパイは毎日少なくとも1枚の服を着ている.
  • I/O例
    clothesreturn[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]5[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]]3
    I/O例説明
    例1
    headgearに対応した服装は黄色hat、緑turban、眼鏡に対応した服装は青サングラスで、以下の5つの組み合わせが可能です.
    1. yellow_hat
    2. blue_sunglasses
    3. green_turban
    4. yellow_hat + blue_sunglasses
    5. green_turban + blue_sunglasses
    例2
    Faceに対応した服装はcrow mask,blue sunglasse,mocky paskであり,以下の3つの組み合わせが可能である.
    1. crow_mask
    2. blue_sunglasses
    3. smoky_makeup
    問題を解く
    最初の解😁
    def solution(clothes):
        a=0
        two = []
        one = []
        while True:
            if a == len(clothes):
                    break
            for i in range(len(clothes)):
                one.append(f"{clothes[i][0]}")
                if i != a and i > a:
                    if clothes[a][1] != clothes[i][1]:
                        two.append((clothes[a][0],clothes[i][0])) 
                if i == len(clothes)-1:
                        a += 1
        two = list(set(two))
        one = list(set(one))
        return len(two) + len(one)
    衣装の種類は2種類までしか並べられません
    失敗🤪
    第二の解釈
    def solution(clothes):
        kind_dic={}
        for name, kind in clothes: #dictionary를 이용하여 각 종류의 갯수를 가지고 온 뒤 
            if kind in kind_dic:
                kind_dic[kind] += 1
            else:
                kind_dic[kind] = 1
        count = 1
        for i in kind_dic.values(): #dictionary의 value를 가져와 1을 더한 수를 곱해준다 (1을 더한 이유? 1을 더하지 않으면 해당되는 의상의 종류를 입지않을 경우를 나타내지 못한다)
            count *= i+1
        return count -1 #아무것도 안 입을 경우는 제한다
    成功👍
    他人の解答
    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
    他人解答2
    def solution(clothes):
        from collections import Counter
        from functools import reduce
        cnt = Counter([kind for name, kind in clothes])
        answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1
        return answer