- 경우의 수를 구하는 문제이므로 해시를 사용해서 푼다!
- 의상의 종류를 키로 같은 종류의 의상 수를 값으로 하는 해시 자료구조를 만든다.
- 모든 경우의 수 = (1번 의상 종류의 의상 수 + 1) (2번 의상 종류의 의상 수 + 1) ... (n번 의상 종류의 의상 수 + 1) 의 공식을 활용해 전체 경우의 수를 구한다.
=> 각 카테고리의 의상 수에 1을 더한 것은 아무것도 입지 않았을 경우를 뜻한다.- (위 사진에선 잘렸지만) 스파이가 하루에 최소 하나의 옷은 입는다고 가정하고 있으므로 아무것도 입지 않는 경우를 빼주는 의미로 -1 한다.
function solution(clothes) {
const closet = new Map();
for(let i=0; i<clothes.length; i++){
if(closet.has(clothes[i][1])){
closet.set(clothes[i][1], closet.get(clothes[i][1])+1);
} else {
closet.set(clothes[i][1], 1);
}
}
let result = 1;
for(let v of closet.values()){
result *= (v+1);
}
return result-1;
}
위 코드를 조금 줄여보면?
function solution(clothes) {
let closet = new Map();
for(let i=0; i<clothes.length; i++){
closet.set(clothes[i][1], (closet.get(clothes[i][1]) || 0) + 1);
}
let result = 1;
for(let v of closet.values()) {
result *= (v+1);
}
return result-1;
}
경우의 수를 구할 때 해시를 사용하는 것을 알지 못했는데, 관련 개념을 검색해서 공식을 알고 푸니 이해가 됐다.
경우의 수 == 해시 !! (다른 좋은 방법이 있으면 댓글로 알려주세요 ,,)
✔️ reduce() 사용
function solution(clothes) {
return Object.values(clothes.reduce((obj, t)=> {
obj[t[1]] = obj[t[1]] ? obj[t[1]] + 1 : 1;
return obj;
} , {})).reduce((a,b)=> a*(b+1), 1)-1;
}
코드 순서 : ②Object.values( ①reduce() ).reduce() ③ -1
①번에서 의상 종류별 의상 갯수를 카운트한 뒤 ②번에서 ①번으로부터 생성된 객체의 값들만 가져와 모든 경우의 수를 계산한다. ③번에서 아무것도 입지 않은 경우를 빼준다.