function solution(clothes) {
const map = new Map();
let answer = 1;
for (let [value, key] of clothes) {
if (map.has(key)) {
const cur = map.get(key);
cur.push(value);
map.set(key, cur);
}
else map.set(key, [value]);
}
for (let [key, value] of map) {
answer *= (value.length + 1);
}
return answer - 1;
}
이 문제를 풀기 전에 Map
객체로 해시 문제를 좀 풀어서 이것도 해시로 풀어봤다. 위처럼 풀면 map
에는 아래와 같이 문자열 key
와 배열 value
가 들어가게 된다.
Map {
'headgear' => [ 'yellowhat', 'green_turban' ],
'eyewear' => [ 'bluesunglasses' ]
}
그런데 경우의 수를 구할 때 어차피 key
별 value
의 개수를 이용하기 때문에 key
에 배열을 저장하는 대신 의상 종류 key
에 해당하는 의상 개수가 몇 개인지를 value
로 정하는 것이 효율적이라는 생각이 들었다 🤔
function solution(clothes) {
const map = new Map();
let answer = 1;
for (let [value, key] of clothes) {
if (map.has(key)) map.set(key, map.get(key) + 1);
else map.set(key, 1);
}
for (let [key, value] of map) {
answer *= (value + 1);
}
return answer - 1;
}
그래서 위처럼 수정! ✍️
object
를 이용한 풀이function solution(clothes) {
const obj = {};
let answer = 1;
for (let [value, key] of clothes) {
if (!obj[key]) obj[key] = 1;
else obj[key] += 1;
}
const values = Object.values(obj);
for (let value of values) answer *= (value + 1);
return answer - 1;
}
object
로도 한번 풀어봤다.
reduce
로 object
만들기const obj = clothes.reduce((a, c) => {
a[c[1]] = a[c[1]] ? a[c[1]] + 1 : 1;
return a;
}, {});
TODO: 내용 추가하기
https://programmers.co.kr/learn/courses/30/lessons/42578?language=javascript