[알고리즘] 코딩테스트 > 해시 > 위장

Bewell·2021년 2월 18일
0

알고리즘

목록 보기
1/2

문제설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.

스파이가 가진 의상들이 담긴 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
}

0개의 댓글