P는 매일 다른 옷을 조합하여 코디합니다. 각 종류 별로 최대 1가지만 착용할 수 있으며, 최소 하루 한 개의 의상은 입습니다. 착용한 의상이 완전 똑같지 않다면 일부가 겹치더라도 다른 방법으로 간주합니다. 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 함수를 작성해주세요.
입출력 예시
| clothes | return |
|---|---|
| ["hat", "headgear"], ["sunglasses", "eyewear"], ["turban", "headgear"] | 5 |
| ["crow_mask", "face"], ["sunglasses", "face"], ["smoky_makeup", "face"] | 3 |
경우의 수를 따지는 문제입니다. 단순히 조합의 수를 구하므로, 각 아이템의 이름보다는 같은 종류별로 몇 개가 있는지가 중요합니다.
만약 안경 종류의 아이템이 3개일 경우, 경우의 수는 아이템 1, 아이템 2, 아이템 3, 안 쓸 경우로 총 4가지가 나옵니다. (4P1)
한 종류와 다른 종류를 동시 착용하는 경우이므로 각 종류의 경우의 수를 구하여 곱셈합니다.
다만, 아무것도 입지 않을 수 없기 때문에 해당 경우를 제거하는 의미로 1을 빼줍니다.
function solution(clothes) {
let answer = 1;
let comb = new Map();
clothes.forEach((cloth)=>{
comb.set(cloth[1], (comb.get(cloth[1])||0) + 1);
})
comb.forEach (count => {
answer *= (count + 1);
})
return answer - 1;
}
comb 라는 새로운 맵에 각 종류와, 개수를 저장합니다. forEach 문을 사용하여 clothes를 순회하는데, 각 아이템의 이름이 아닌 종류를 구해야 하므로 1번째 (0번째 무시) 만 받아 comb에 넣고 갯수를 1씩 증가시킵니다.
모두 순회하여 종류 별 갯수가 구해졌다면, 이번엔 comb를 순회합니다.
착용하지 않을 경우를 포함해 value 값에 1을 더하고, 그 값을 answer 에 곱하여 누적합니다.
마지막으로 모두 안 입을 경우를 제외하여 -1을 한 값을 리턴합니다.