반응형

문제링크:https://programmers.co.kr/learn/courses/30/lessons/42578

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

해쉬를 이용해서 조합을 구하는 문제

 

문제는 다음과 같다.

 

눈장식- 선글라스, 안경

머리장식- 헤드밴드, 헬멧, 모자 

 

이런식으로 있다고 생각할때, 아래와 같이 안쓴경우도 생각한다.

눈장식- 선글라스, 안경,안씀

머리장식- 헤드밴드, 헬멧, 모자 ,안씀

 

그럼 눈장식과 머리장식의 경우의 수는 

3*4=12 이다. 이때 안씀 *안씀 의 경우도 있는데, 아무것도 안쓸순없으니 이 경우의수를 한번 빼면 11이다.

 

저렇게 눈장식, 머리장식 종류에 따라서 리스트를 만들려면 

[모자, 머리장식] 으로 되어있는 배열을 받았을때 해쉬맵으로 만들어주고 부위별 링크드 리스트를 통해서 받아주면된다.

 

키-값은 

부위-부위별종류의리스트

String, LinkedList<String>

이다.

 

그러면 아래처럼 구현하면 된다.

 

import java.util.*;
class Solution {
    public int solution(String[][] clothes) {
        int answer = 0;
        int count=0;
        HashMap<String, LinkedList<String>> hm = new HashMap<>();
        for(String[] s: clothes){
            
            if( hm.containsKey(s[1])){ //이미 있다면?
                LinkedList<String> ll = new LinkedList<>();
                ll= hm.get(s[1]);
                ll.add(s[0]);
                hm.replace(s[1],ll);
                count++;
            }//처음이라면
            else{
                LinkedList<String> ll = new LinkedList<>();
                ll.add(s[0]);
                hm.put(s[1],ll);
                count++;
            }
        }
        
       
        //구하는식: 헤드기어2개 눈장식 1개면 안입은경우도 포함해서 3개 ,2개로 생각하고 3*2를하고 안낀것과 안낀것의 조합은 없으니까 그걸 1개 빼면 3*2-1 하면된다.
            int ans=1;
            int cn=0;
            for(String s : hm.keySet()){
                ans *= hm.get(s).size()+1;
                
            }
            ans-=1;
            
            answer= ans;
        
        
        
        
        
        return answer;
    }
}

직접 구현한 코드이므로 무단복제를 금지합니다.

반응형
Yellongs