https://programmers.co.kr/learn/courses/30/lessons/42578
function solution(clothes) {
let ans = 1;
let hash_map = new Map();
// Map에 값 넣기
for (let i = 0; i < clothes.length; i++) {
let kind = clothes[i][1];
let name = clothes[i][0];
hash_map.set(kind, (hash_map.get(kind) || 0) + 1);
}
// ans 계산 방식 (밑에 설명 참고)
for (let [k, v] of hash_map) {
ans *= (v + 1);
}
return ans - 1;
}
✔ 의상 조합의 수를 구하기 위해서는 의상의 종류별로 의상이 몇개가 있는지 확인해야 한다.
✔ 의상의 종류를 key값으로 해당 종류에 해당하는 옷의 개수를 value값으로 저장하기 위해서[key,value] 쌍으로 값을 저장할 수 있는 Map이라는 자료구조를 활용하였다. (Hashing)
❌ 처음에 생각했던 ans 계산 방식
예를들어 의상의 종류가 4개이고 각각 4개,2개,5개,3개인 clothes 2차원배열이 들어왔다고 가정하자.
그러면 ans이 될 수 있는 경우의 수를 생각해보면
① 한가지 의상종류만 입는 경우
4 + 2 + 5 + 3
② 두가지 의상종류만 입는 경우
(4*2) + (4*5) + (4*3) + (2*5) + (2*3) + (5*3)
③ 세가지 의상종류만 입는 경우
(4*2*5) + (2*5*3)
④ 네가지 의상종류만 입는 경우
4*2*5*3
이 네 가지 경우의 수를 더하면 ans가 된다.
하지만 의상의 종류가 커질수록 계산하기 복잡하므로 다른 방식을 고민하였다.
👍 제출한 ans 계산 방식
스파이는 최소한 한종류의 의상을 입어야 한다.
따라서 모든 종류의 옷 개수에 +1을 하여 한번에 곱하고 모든 종류의 옷을 안입는 경우인 1가지 경우의 수만 제거해주면 된다.
위에서 예시로 들었던 4가지 종류(각각 4,2,5,3개)로 계산을 해보면
(4+1)*(2+1)*(5+1)*(3+1) 에서 1을 빼주면 ans가 된다.
✔ 난이도 : 프로그래머스 기준 LEVEL 2