스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
---|---|
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
[의상의 이름, 의상의 종류]
로 이루어져 있습니다.clothes | return |
---|---|
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]] | 3 |
경우의 수를 생각해보며 풀이하면 됩니다.
의상의 종류가 모자, 상의, 하의 3가지이고 각각 3개 3개 4개의 의상이 존재한다고 가정해보겠습니다.
모자를 선택하는 경우의 수는 3, 상의를 선택하는 수는 3, 하의를 선택하는 경우의 수는 4이므로
3*3*4
가 됩니다.
하지만 모자를 쓰지 않고 상의와 하의를 입을 수 있으므로 각 의상의 개수에 입지않는다 라는 선택지를 추가할 수 있습니다.
해당 선택지를 추가하게 된다면 다음 그림과 같은 모양이 나타나게 되며 4 * 4 * 5
라는 식을 구할 수 있습니다.
그러나 제약사항을 보면
스파이는 하루에 최소 한 개의 의상은 입습니다.
제약사항을 만족하기 위해서는 어떤 옷이던 골라야합니다. 해당 식은 모든 옷을 입지 않는 경우의 수가 포함되어 있으므로 이를 제거한다면 제약사항을 만족시킬 수 있습니다.
그러므로 (4 * 4 * 5) -1
이라는 식이 나타나게 됩니다.
def solution(clothes):
a = {}
for i in range(len(clothes)):
if clothes[i][1] in a:
a[clothes[i][1]] += 1
else: a[clothes[i][1]] = 1
# 딕셔너리 형태로 변환하여 옷의 개수를 센다.
# {'headgear': 2, 'eyewear': 1}
a_list=list(a.values()) # [2,1]
num = 1
for j in range(len(a_list)):
num *= (a_list[j]+1)
return num-1