1개씩 입는 것과 1개 이상 조합해서 입는 걸 나눈 게 화근이었다. 덕분에 혼자 엄청 꼬였다. 종류 개수에 따라 경우의 수가 확확 달라질 수 있다고 생각했다. 재귀를 연습해보고 싶어서 되지도 않는 삽질을 했다.
애초에 객체로 변환할 때, 옷을 1가지만 입는 경우를 고려해서
false면 0+1이 아니라 1+1로 넣었어야 한다.
/* 틀린 풀이 ... */
function solution(clothes) {
let obj = {};
for (let i=0; i<clothes.length; i++) {
if (obj[clothes[i][1]]) obj[clothes[i][1]]++;
else obj[clothes[i][1]]=1;
}
let answer=1;
if ((Object.keys(obj).length == 1)) {
answer=clothes.length;
}
else if (Object.keys(obj).length == 2) {
for (let i=0; i<Object.keys(obj).length; i++) {
answer = answer * Object.values(obj)[i];
}
answer = answer + clothes.length;
}
else if (Object.keys(obj).length > 2) {
answer=0;
let val = [...Object.values(obj)];
let tmp = [];
let ch = Array.from({length:val.length}, () => 0);
let ans=1;
for (let k=2; k<Object.keys(obj).length; k++) {
function cb (L,s) {
if (L==k) {
for (let j=0; j<tmp.length; j++) {
ans=ans*tmp[j];
}
answer += ans*1;
}
else {
for (let i=s; i<val.length; i++) {
if (ch[i]==0) {
tmp[L]=val[i]
ch[i]=1;
cb(L+1, i+1);
ch[i]=0;
}
}
}
}
cb(0,0)
}
answer = answer + clothes.length;
}
return answer;
}
console.log(solution(
[["yellow_hat", "head"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]))
아주 단순하게 객체로 변환 -> values를 곱해준 뒤,
최소 1가지 옷을 입으므로 옷을 입지 않는 경우를 -1 해주면 되는 방식.
function solution(clothes) {
var answer = 1;
var obj={};
for(let i=0;i<clothes.length;i++){
obj[clothes[i][1]]=(obj[clothes[i][1]] || 1) + 1;
}
for(let key in obj){
answer *= obj[key];
}
return answer-1;
}
또 다른 풀이
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;
}