본문 바로가기
알고리즘

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

by dohye1 2022. 9. 21.

목차

    반응형

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

    레벨 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년전에 한번 풀었던문제인데, 그때보다는 손쉽게 푼것같다!

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

     

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