매일 스파이가 다른 옷을 조합하여 자신을 위장한다고 한다. 스파이가 가진 의상들을 2차원 배열로 주어질때 서로 다른 조합의 수를 반환하는 함수를 작성해야한다.

아.. 조합이라니.. 알고리즘을 풀기 위해서는 간단한 수학 개념도 있으면 확실히 풀기 편할것 같다는 생각을 했다.

간단하게 인터넷에 조합의 의미를 찾아보자. 수학에서 말하는 조합은 서로다른 n개의 원소 중에서 순서에 상관없이 r개를 선택하는 것이다. 우리가 풀문제는 어느정도 순서가 상관이 있다. 아마 문제에서 말하는 조합은 여러개를 모아서 입을수 있는 개수 정도로 이해하면 될듯 싶다.

예시를 가지고 간단하게 로직을 작성해보자.

종류 - 이름  
headgear - yellow_hat    
eyewear - blue_sunglasses
headgear - green_turban

headegear는 yellow_hat, green_turban,
eyewear는 green_turban가 있다.

이제 조합의 수를 생각해보자

  1. headegear
    쓰지 않는 경우, yellow_hat, green_turban 해서 총 3가지

  2. eyewear
    쓰지 않는 경우, green_turban 해서 총 2가지

총 조합의 개수는 3 * 2로 6개 이다. 문제의 제한상에서 스파이는 하루에 최소 한 개의 의상을 입기 때문에 의상을 입지 않는 경우인 1을 빼준 값인 5를 반환하면 된다.

코드로 풀어보자.

function solution(clothes) {
    var answer = 1;
    // 입을 의상의 종류.  
    const clothesType = clothes.map( ele => ele[1]);
    // 입을 의상의 종류의 개수
    const clothesTypeCnt = clothesType.reduce( (acc, value) => {
        acc[value] = acc[value] ? acc[value] + 1 : 1;
        return acc;
    }, {}) ;
    // 입을 의상의 조합의 수 
    for( let value in clothesTypeCnt ){
         answer *= (clothesTypeCnt[value])+1
    }
    return answer - 1;
}