수학적 사고를 이용하는 경우의 수 문제입니다.
카테고리 별로 옷 개수를 카운팅을 하고
그 카운팅을 모두 곱하는 식으로 풀면 될 거 같습니다.
예를 들어서
썬글라스 - 3개
바지 - 6개
상의 - 3개
이렇게 있다고 가정을 해봅시다.
조합 공식에 의하면
썬글라스를 고르는 경우의 수 x 바지를 고르는 경우의 수 x 상의를 고르는 경우의 수
즉 경우의 수는 3 x 6 x 3 = 54 가 되겠죠?
하지만 이렇게 조합을 구하게 되면 답을 구할 수 없게 됩니다.
1번 조건, 그리고 예시를 보면 옷을 하나만 입어도 경우의 수로 카운팅을 할 수 있죠.
그렇다면 각 카테고리별로 옷을 입지 않은 날도 있을테니
입지 않은 경우의 수를 더해줘서 곱해야합니다
썬글라스 - 3개(썬글라스를 고르는 경우의 수) + 1개(썬글라스를 안 고른 경우의 수)
바지 - 6개(바지를 고르는 경우의 수) + 1개(바지를 안 고른 경우의 수)
상의 - 3개(상의를 고르는 경우의 수) + 1개(상의를 안 고른 경우의 수)
즉 경우의 수는 4 x 7 x 4 = 112가 됩니다.
하지만 역시 이 결과도 정답이 아닙니다!
눈치 빠르신 분들은 알아채셨겠죠?
이렇게 조합을 하면 아무것도 안 고른 경우의 수도 존재하기 때문에
답에서 -1을 해줘야합니다.
고로 정답은 111이 됩니다.
총 정리를 해보면
1. 카테고리 별로 옷을 카운팅합니다.
2. 각 카운팅 개수에 +1 한 값들을 다 곱합니다.
3. 다 곱한 값에 1을 뺍니다.
function solution(clothes) {
return Object.values(clothes.reduce((m, v) => {
// 1. 카테고리 별로 옷을 카운팅합니다.
m[v[1]] = m[v[1]] ? m[v[1]] + 1 : 1;
return m;
// 2. 각 카운팅 개수에 +1 한 값들을 다 곱합니다.
// 3. 다 곱한 값에 1을 뺍니다.
}, {})).reduce((m, v) => m *= (v + 1), 1) - 1;
}