✨ Lv. 2 - 의상
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42578
코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.
예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.
종류 | 이름 |
---|---|
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
우선 단순히 옷을 어떻게 조합하여 입을 수 있는지에 대해 생각해보았습니다. 입력에서 같은 이름을 가진 의상은 존재하지 않는다는 조건이 있으므로, 옷의 카테고리 별 가짓수로 생각해봅시다.
만약 얼굴에 A, B라는 2종류가 있다고 가정한다면, 얼굴에 의상을 착용하는 가짓수는 A
, B
, 입지 않음
으로 총 3가지일 것입니다. 그렇다면 단순하게 얼굴에 2종류, 상의 1종류가 존재한다고 하면 선택할 수 있는 가짓수는 어떻게 될까요?
- 얼굴 : A / 상의 : A
- 얼굴 : B / 상의 : A
- 얼굴 : A / 상의 : 안입음
- 얼굴 : B / 상의 : 안입음
- 얼굴 : 안입음 / 상의 : A
얼굴 : 안입음 / 상의 : 안입음
단순히 생각한다면 3 x 2
로 6가지라 생각할 수 있지만, 의상 중 적어도 하나는 착용해야하기 때문에 전부 입지 않는 경우의 수인 1
을 제외해야 합니다.
그렇다면 이를 코드로 구현해보겠습니다. 빈 객체를 만든 후, clothes
를 순회하며 index 1
에 있는 옷의 종류별로 가짓수를 저장합니다. 이후, 해당 객체를 순회하며 각 가짓수에 1을 더한 값을 모두 곱한 값을 구한 이후, 여기에 전부 입지 않는 경우의 수인 1
을 빼내어 결과를 도출합니다.
function solution(clothes) {
let category = {};
let result = 1;
clothes.forEach((v) => category[v[1]] = (category[v[1]] || 0) + 1);
for(let v in category) result *= (category[v] + 1);
return result - 1;
}
감사합니다 :)