문제설명
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
문제이해
우선 이러한 경우의수를 물어보는 문제는 결과값이 도출되는 공식을 미리 도출한 상태에서 진행하는게 더 수월하다. 그렇지 않으면 코드만 길어지고 가독성이 안좋아진다.
스파이가 갖고 있는 의상의 종류
, 의상의 수
를 정리하면 아래와 같다.
예제1) 경우의수 5
headgear: yellow_hat, green_turban
eyewear: blue_sunglasses
예제2) 경우의 수 3
face: crow_mask, blue_sunglasses, smoky_makeup
공식도출
(의상의 수 + 1) * (의상의 수 + 1) - 1 = 경우의 수
코드
function solution(clothes) {
const organizeClothesInObject = clothes.reduce((acc, curr) => {
acc[curr[1]] ? acc[curr[1]] += 1 : acc[curr[1]] = 1
return acc
}, {})
let result = 1
for (let key in organizeClothesInObject) {
result *= (organizeClothesInObject[key] + 1)
}
return result - 1
}
개선사항
1. Object.values
를 이용해 객체 안의 value값들로 reduce를 이용해 원하는 값을 도출할 수 있음
function solution(clothes) {
return Object.values(clothes.reduce((acc, curr) => {
acc[curr[1]] ? acc[curr[1]] += 1 : acc[curr[1]] = 1
return acc
}, {})).reduce((acc, curr) => {
return acc * (curr + 1)
}, 1) - 1
}