알고리즘

[프로그래머스] 42578 해쉬 > 위장

dohye1 2022. 9. 21. 00:08
반응형

프로그래머스 해쉬 문제를 풀어보았다.

레벨 2문제인데, 코드로 짜는것보다 생각하는데에 시간을 더쓴것같다.

풀이방법

아래의 입력값을 받아서, catogory별로 묶은다음, 입을수있는 옷의 조합의 총 count를 구하는것이다.

조건

  1. 동일한 category의 옷은 동시에 입지못한다.
  2. 적어도 한개의 옷은 입어야한다.

이 문제를 보고 고등학생때배운 경우의수..?인가 암튼 그 파트가 생각났다.

 

그래서 일단은 내가 다루기 쉬운 자료구조로 변경한 뒤, count를 세고자 했다.

function categorizingClothe(clothes){
    // 같은 종류의 옷을 하나의 배열로 묶는다.
    // Record<Category, cloth[]>
    const mappedData = clothes.reduce((acc, cur)=> {
        const [cloth, category] = cur;
        if(acc[category]){
            acc[category].push(cloth)
        }else{
            acc[category] = [cloth]
        }
        return acc;
    }, {})
    
    return mappedData;
}

해쉬 문제를 풀때는 reduce를 자주 사용하는것같다.

암튼 위의 함수를 보면, 나는 [catogory]를 key로 설정하고, 그 category에 해당하는 옷들을 한개의 배열에 넣어주었다.

그래서 위와같은 형태로 만들었음!!

 

그리고나서 

function solution(clothes) {
    const clothList = categorizingClothe(clothes);
    
    const combinationCount = Object.values(clothList).reduce((acc, cur) => {
        acc *= cur.length + 1;
        return acc;
    }, 1);
    
    return  combinationCount - 1;
}

clothList를 사용해서 어떻게 풀고자 했냐면,

옷을 조합할때, 각 카테고리에서 선택할 수 있는 옷의 개수는 배열의 길이와 같을것이다. 

그래서 각각의 카테고리에서 선택할 수 있는 옷의 개수를 모두 곱해주면 경우의 수를 구할 수 있다.

 

그런데, 특정 카테고리에서 내가 입을 옷을 선택하지 않을경우도 있다!! >>> 이게 이 문제의 핵심인것같다

 

그래서 카테고리에서 선택할 수 있는 옷의 개수 를 곱해줄때 옷의 개수 1  (=== 아무것도 입지않음)을 더해준것이다.

 

그럼 옷의 조합을 구성할 수 있는 모든 경우의수를 구할수있는데, 그 많은 조합중에서 아무것도 입지않음만 존재하는 조합이 1개 존재하게된다.

그래서 combinationCount에서 1을 빼주었다.

전체코드

function categorizingClothe(clothes){
    // 같은 종류의 옷을 하나의 배열로 묶는다.
    // Record<Category, cloth[]>
    const mappedData = clothes.reduce((acc, cur)=> {
        const [cloth, category] = cur;
        if(acc[category]){
            acc[category].push(cloth)
        }else{
            acc[category] = [cloth]
        }
        return acc;
    }, {})
    
    return mappedData;
}

function solution(clothes) {
    const clothList = categorizingClothe(clothes);
    
    const combinationCount = Object.values(clothList).reduce((acc, cur) => {
        acc *= cur.length + 1;
        return acc;
    }, 1);
    
    return  combinationCount - 1;
}

 

이거 2년전에 한번 풀었던문제인데, 그때보다는 손쉽게 푼것같다!

나...성장한걸까..?ㅎ...ㅋㅋㅋ

 

암튼 올만에 문제푸니깐 재미있는듯!