[プログラマー]偽装


1.問題の説明


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

2.制限

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

    def solution(clothes):
        a = {}
        for i in range (0, len(clothes)):
            if (clothes[i][1] not in a):
                a[clothes[i][1]] = 1
            else:
                a[clothes[i][1]] = a[clothes[i][1]] + 1
    このように服の個数を数えて、1つの服の種類-個数ペアのディックシャーナを作ろうと思ったのですが、1つの服しか着ていないのであれば、2つの服しか着ていないのであれば、このように数えて、最後に諦めて、グーグルで答えを検索しました.
    def solution(clothes):
        a = {}
        for i in range (0, len(clothes)):
            if (clothes[i][1] not in a):
                a[clothes[i][1]] = 1
            else:
                a[clothes[i][1]] = a[clothes[i][1]] + 1
        
        answer = 0
        for i in a.values():
            if answer == 0:
                answer += (i + 1)
            else:
                answer *= (i + 1)
        answer -= 1
        
        return answer
    このパズルを初めて見たとき、どうしてそう思うのかと思った.答えを導く過程は想像以上に簡単だ.たとえば,{headger:2,[眼鏡]:1}です.
    すべての場合の数字を計算すると、(headgerを使用したときの数字(2)+使用しないときの数字(1)*(眼鏡を使用したときの数字(1)+使用しないときの数字(1)-(何も使用しないときの数字(1)=5)が簡潔に表示されます.このような方法でより簡潔に問題を解決するためには、もっと努力すべきだと思います.

    4.問題リンク


    https://programmers.co.kr/learn/courses/30/lessons/42578