from functools import reduce


def solution(clothes):
    # 1. 종류별 옷의 갯수를 센다.
    categories = dict()

    for cloth, category in clothes:
        if category not in categories:
            categories[category] = []

        categories[category].append(cloth)

    # 2. 종류별로 옷을 고르는 경우의 수를 모두 곱한다. (안고르는 경우도 있기 때문에 + 1)
    answer = 1

    for category in categories.keys():
        answer *= len(categories[category]) + 1

    # 3. 모두 안고르는 경우의 수 한 개를 빼고 결과를 반환한다.
    return answer - 1


# 정확성  테스트
# 테스트 1 〉	통과 (0.01ms, 10.2MB)
# 테스트 2 〉	통과 (0.01ms, 9.99MB)
# 테스트 3 〉	통과 (0.01ms, 10MB)
# 테스트 4 〉	통과 (0.01ms, 10.2MB)
# 테스트 5 〉	통과 (0.01ms, 10.2MB)
# 테스트 6 〉	통과 (0.01ms, 10.1MB)
# 테스트 7 〉	통과 (0.01ms, 9.99MB)
# 테스트 8 〉	통과 (0.01ms, 10.2MB)
# 테스트 9 〉	통과 (0.01ms, 10.3MB)
# 테스트 10 〉	통과 (0.01ms, 10MB)
# 테스트 11 〉	통과 (0.01ms, 10.1MB)
# 테스트 12 〉	통과 (0.01ms, 10MB)
# 테스트 13 〉	통과 (0.01ms, 10MB)
# 테스트 14 〉	통과 (0.01ms, 9.98MB)
# 테스트 15 〉	통과 (0.01ms, 10.1MB)
# 테스트 16 〉	통과 (0.00ms, 10MB)
# 테스트 17 〉	통과 (0.01ms, 10.1MB)
# 테스트 18 〉	통과 (0.01ms, 10.2MB)
# 테스트 19 〉	통과 (0.01ms, 10.1MB)
# 테스트 20 〉	통과 (0.01ms, 10.2MB)
# 테스트 21 〉	통과 (0.01ms, 10.3MB)
# 테스트 22 〉	통과 (0.00ms, 10MB)
# 테스트 23 〉	통과 (0.01ms, 10.2MB)
# 테스트 24 〉	통과 (0.01ms, 9.99MB)
# 테스트 25 〉	통과 (0.01ms, 10MB)
# 테스트 26 〉	통과 (0.01ms, 10.1MB)
# 테스트 27 〉	통과 (0.00ms, 10.1MB)
# 테스트 28 〉	통과 (0.01ms, 10.2MB)
# 채점 결과
# 정확성: 100.0
# 합계: 100.0 / 100.0

def solution2(clothes):
    # 1. 종류별 옷의 갯수를 센다. (안고르는 경우도 있기 때문에 + 1)
    categories = dict()

    for cloth, category in clothes:
        categories[category] = categories.get(category, 1) + 1

    # 2. 종류별로 옷을 고르는 경우의 수를 모두 곱한다. 모두 안고르는 경우의 수 한 개를 빼고 결과를 반환한다.
    return reduce(lambda x, y: x * y, categories.values()) - 1


# 정확성  테스트
# 테스트 1 〉	통과 (0.01ms, 10.1MB)
# 테스트 2 〉	통과 (0.01ms, 10MB)
# 테스트 3 〉	통과 (0.01ms, 10MB)
# 테스트 4 〉	통과 (0.01ms, 10.1MB)
# 테스트 5 〉	통과 (0.01ms, 10.2MB)
# 테스트 6 〉	통과 (0.01ms, 10.2MB)
# 테스트 7 〉	통과 (0.01ms, 10.2MB)
# 테스트 8 〉	통과 (0.01ms, 10MB)
# 테스트 9 〉	통과 (0.01ms, 10.1MB)
# 테스트 10 〉	통과 (0.01ms, 10.3MB)
# 테스트 11 〉	통과 (0.01ms, 10.1MB)
# 테스트 12 〉	통과 (0.01ms, 10.2MB)
# 테스트 13 〉	통과 (0.01ms, 10.2MB)
# 테스트 14 〉	통과 (0.00ms, 10.2MB)
# 테스트 15 〉	통과 (0.00ms, 10.2MB)
# 테스트 16 〉	통과 (0.00ms, 10.2MB)
# 테스트 17 〉	통과 (0.01ms, 10MB)
# 테스트 18 〉	통과 (0.01ms, 10.1MB)
# 테스트 19 〉	통과 (0.01ms, 10.1MB)
# 테스트 20 〉	통과 (0.01ms, 10.2MB)
# 테스트 21 〉	통과 (0.00ms, 10.2MB)
# 테스트 22 〉	통과 (0.00ms, 10.2MB)
# 테스트 23 〉	통과 (0.01ms, 9.98MB)
# 테스트 24 〉	통과 (0.01ms, 10.1MB)
# 테스트 25 〉	통과 (0.01ms, 10.2MB)
# 테스트 26 〉	통과 (0.01ms, 9.99MB)
# 테스트 27 〉	통과 (0.01ms, 10.3MB)
# 테스트 28 〉	통과 (0.01ms, 10.2MB)
# 채점 결과
# 정확성: 100.0
# 합계: 100.0 / 100.0

assert (solution([["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]) == 5)
assert (solution([["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]]) == 3)
