본문 바로가기

코딩테스트

프로그래머스(JAVA) - Hash (의상)

문제정리

각 종류별로 최대 1가지 의상만 착용할 수 있다. 
clothes 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있으며, 같은 이름을 가진 의상은 존재하지 않고 알파벳 소문자 또는 _로만 이루어져 있다. 

 

처음 작성한 코드

class Solution {
    public int solution(String[][] clothes) {
        int answer = clothes.length;

        Map<String, Integer> type = new HashMap<>();

        for(int i = 0; i < clothes.length; i++){
            type.put(clothes[i][1],type.getOrDefault(clothes[i][1],0) + 1);
        }

        for(int i = 0; i < clothes.length; i++){
            if(type.size() == 1){
                break;
            }

            while(!type.containsValue(0)){
                type.put(clothes[i][1], type.getOrDefault(clothes[i][1], 0) - 1);
                answer++;
            }
        }

        return answer;
    }
}

 

위와같이 코드를 작성한 이유는 일단 map에 headgear, eyewear와 같이 의상의 종류를 넣고 getOrDefault를 사용하여 종류의 개수를 value 값으로 들어갈 수 있게 지정
아래 코드는 type.size()가 1인 경우에는 의상의 종류가 하나이기에 break를 하여 배열 개수가 반환하게 하였고, while 문은 의상의 종류의 개수가 동일한 값 만큼 개수를 더하게 만들어서 반환되게 하도록 만든건데..
결과는 실패..

진짜 너무 단순하게 생각했던 것 같음 각 경우의 수를 생각을 하고 계산을 했어야 했는데;;

최종코드

class Solution {
    public int solution(String[][] clothes) {
        Map<String, Integer> type = new HashMap<>();

        // 의상 종류별 개수 카운트
        for (String[] cloth : clothes) {
            type.put(cloth[1], type.getOrDefault(cloth[1], 0) + 1);
        }

        int answer = 1;

        // (각 종류별 개수 + 1) 곱하기
        for (int count : type.values()) {
            answer *= (count + 1);
        }

        // 모든 의상을 입지 않는 경우(1) 제외
        return answer - 1;
    }
}

 

type.values()는 HashMap<String, Integer>에 지정된 각 의상 종류별 개수를 가져오는 역할을 한다. { "headgear":2, "eyewear":1 } 이면 type.values()는 [2, 1] 을 반환하게 된다.

그래도 잘 생각했던 부분은 getOrDefault를 생각해낸 점? 몇일전까지만 해도 저걸 사용해야겠다는 생각을 못했는데.. 굿..

시간은