바코94 2021. 1. 3. 16:36

programmers.co.kr/learn/courses/30/lessons/42578?language=javascript

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

1. 종류별로 구분한다.

2. 종류1 2개, 종류2 1개 인 경우를 생각해보자.

2.1 종류1에서 하나를 뽑거나 안 뽑을 수 있다. 따라서 경우의 수는 하나를 뽑는 경우는 두 가지 + 안 뽑는 경우는 1 =>3

2.2 종류2에서 하나를 뽑거나 안 뽑을 수 있다. 하나 뽑는 경우는 한 가지 + 안 뽑는 경우 1 => 2

2.3 2.1의 경우의수와 2.2의 경우의 수를 곱하면 3*2인 6이 된다. 

즉, 종류 1에는 {"a","b"}, 종류 2에는 {"z"} 가 있었다고 하면 위에서 가정한 조합은 다음과 같다.

{"a", "b" , x } x {"z", "x"}. 여기서 "x"는 안 뽑은 경우

{["a","z"] , ["a","x"], ["b","z"], ["b","x"], ["x","z"], ["x","x"] } 와 같이 된다. 여기서 ["x","x"]는 하나도 선택하지 않은 경우이다.

 

따라서 3*2 해준 값에 -1을 해주면 하나도 선택하지 않은 경우를 뺄 수 있다.

 

풀이 코드

function solution(clothes) {
    let obj = {}
    
    clothes.forEach(([val, key])=>{
        obj[key] = obj[key] ? [...obj[key], val] : [val]
    })
    
    let mul = 1;
    for(const key in obj){
        mul = mul *(obj[key].length +1);
    }
    
    return mul -1;
}