스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
∙ clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
∙ 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
∙ 같은 이름을 가진 의상은 존재하지 않습니다.
∙ clothes의 모든 원소는 문자열로 이루어져 있습니다.
∙ 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
∙ 스파이는 하루에 최소 한 개의 의상은 입습니다.

예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.
예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.
버전 1
function solution(clothes) {
let closet = clothes.reduce((categorySum, cloth) => {
categorySum[cloth[1]] = (categorySum[cloth[1]]) ? categorySum[cloth[1]] + 1 : 1;
return categorySum;
}, {}); //reduce 함수에서 {}로 풀게 되면 return값 필수
let item = Object.values(closet);
if (item.length === 1) {
return item[0];
}
let result = 1;
item.forEach((category) => result *= (category + 1));
return result - 1;
}
버전 2
function solution(clothes) {
const category = [];
const count = [];
clothes.forEach(cloth => {
if(category.indexOf(cloth[1]) === -1) {
const index = category.length;
category[index] = cloth[1];
count[index] = 1;
} else {
const index = category.indexOf(cloth[1]);
count[index] += 1;
}
});
return count.reduce( (sum, current) => sum * (current + 1), 1) - 1;
}
아무래도 위장할 옷 이름들의 조합으로 해결하기보다는 의상의 종류별 카운트를 저장해서 풀어가야 한다.
버전1 기준으로closet의 변수에 종류별 누적값을 넣고 그 누적값(value)만 Object.values() 메서드를 이용해서 배열로 뽑아낸다.
주어진 모든 옷의 종류가 한 가지라면 item에는 딱 한 종류만 들어있기 때문에 item[0]을 바로 리턴.
이 부분까지는 생각을 했지만 의상 조합을 계산하는 부분에서 마무리가 되지 않았다. 만약 a, b, c, d 라는 각기 다른 종류의 의상이 있을 때,
모든 종류 의상을 다 입을 때는 abc*d이지만 주어진 문제의 조건은 한 개만 걸칠 수도 있어서 (a+1)(b+1)(c+1)(d+1)로 계산해야 한다. 그리고 아무것도 안입고 있는 경우까지 포함이므로 마지막에 -1이 필수다. 부분이 참고 풀이 두 가지에서 얻었던 포인트.
추가)



참고풀이 버전1: https://im-developer.tistory.com/128
참고풀이 버전2: https://sustainable-dev.tistory.com/104
추가: https://ko.javascript.info/keys-values-entries
import collections
def solution(clothes):
answer = 1
kind = []
for i in range(len(clothes)):
kind.append(clothes[i][1])
kind = collections.Counter(kind)
for i in list(kind.values()):
answer *= (i + 1)
return answer - 1