[Programmers]-위장(해시)

문제

옷의 조합을 모두 고려하는 문제이다.

문제는 귀찮아서 안가져왔다. ((종류별의상 수+1)* 종류) -1이 답을 구하는 식입니다.

위의 식이 나온 이유는 종류별로 안입을 경우의 수도 있으니 +1있고 최소 한개의상을 입으니 모든 의상을 입지않는 경우의 수를 -1해주었기 때문이다.

코드

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        int cnt=0;//종류별 수
        boolean[] done = new boolean[clothes.length];//수 셀때 포함했던것들은 구분하는 배열
        String key = "";//종류값 담을 비교 키
        
        for(int i=0;i<clothes.length;i++){
            if(done[i]==true) continue;//구분한것은 넘어간다
            
            key = clothes[i][1];//초기값
            cnt=0;
            for(int j=0;j<clothes.length;j++){
                
                if(done[j]==true) continue;
                
                if(clothes[j][1].equals(key)){
                    cnt++;
                    done[j]=true;
                }
            }
            answer = answer*(cnt+1);
        }
        return answer-1;
    }
}

요약

위의 내용이 처음 푼 코드이다. 설명도 이해하기 어렵고 코드를 쉽게 해보려고 다시 코딩했다.

import java.util.HashMap;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        
        HashMap<String,Integer> hm = new HashMap<>();
        
        for(String[] key : clothes){//옷종류별 수를 해시맵에 담는다.
            hm.put(key[1], hm.getOrDefault(key[1], 1) + 1);
        }
        
        for(String key : hm.keySet()){//종류별 수를 곱한다.
            answer *= hm.get(key);
        }
        
        return answer-1;
    }
}

설명

예를들어 모자 : 2, 상의 : 1 이면 (2+1) x (1+1) - 1 이 답이된다. -1한 이유는 조건에 아무것도 안입는 경우는 없기때문이다.

좀더 간결하고 연산만 해주면 되니 보기 좋아졌다.