function solution(clothes) {
// 어떤 물건을 착용하는 것인지는 중요하지 않다.
// 몇 개의 조합을 만들어 낼 수 있느냐가 중요하다.
let map = new Map();
for(let cloth of clothes){
const type = cloth[cloth.length - 1];
if(!map.has(type)){
map.set(type, 1);
continue;
}
map.set(type, map.get(type) + 1);
}
const valIter = map.values();
if(map.size === 1){
return valIter.next().value;
}
let multiple = 1;
for(let i = 0; i < map.size; i++){
const entry = valIter.next().value;
multiple = multiple * (entry + 1);
}
// 전부 안 입었을 경우는 허용되지 않으므로 제거해준다.
return multiple - 1;
}
이 문제는 경우의 수를 따지는 문제이다.
따라서, 모든 경우의 수를 구하기만 하면 되기 때문에, 어떤 옷을 입는지는 관심사가 아니다.
단, 어떤 종류의 옷을 입는지에만 집중해주면 된다.
따라서, 옷의 종류를 key
로 가지면서, 그 종류의 옷의 개수를 value
로 가지도록 Hash Map
을 만들었다.
만약, 옷의 종류가 하나 뿐이라면 그 옷의 개수가 곧 모든 경우의 수이다.
만약, 옷의 종류가 여러 개라면, 모든 종류의 옷 개수의 곱이 모든 경우의 수가 된다.
단, 옷을 입지 않는 경우는 없기 때문에 이를 제거해줘야하는데, 여기서 문제가 발생한다.
단순하게 각 종류마다 옷의 개수를 곱해주는 것은 옷을 입지 않는 경우를 포함하지 않기 때문에,
특정 종류의 옷을 입지 않는 경우를 포함하지 않는다.
따라서, 특정 종류의 옷 + 1
을 한 뒤 곱해줘야, 특정 종류의 옷을 입지 않는 경우도 계산할 수 있게 된다.
이렇게 전부 곱해준 뒤에 모두 입지 않는 경우, 즉 단 하나의 경우만 빼주면
모두 입지 않은 경우만 제외한 모든 경우의 수를 구할 수 있게 된다!