[프로그래머스/42578] 의상

☑️ 문제

프로그래머스 42578

☑️ 풀이

  • 처음에는 HashMap의 < Key , Value >로 < 이름 , 종류 > 를 넣었다. 반복문을 돌면서 조합을 구해야 하는데 어떻게 해야 할 지 감이 잡히지 않았다.

첫 번째 풀이

  • 질문하기에 올라온 힌트를 보니 HashMapValue 에는 다양한 데이터의 값이 들어올 수 있어서 < 종류 , List<이름> >로 푼 것을 참고하여 다시 풀어보았다.
  • 수학 공식을 풀듯이 조합을 계산해보면
    • 종류가 1개, 개수는 a개 → 입을 수 있는 경우의 수는 a개
    • 종류가 2개, 개수는 a, b개 → 입을 수 있는 경우의 수는 a, b, ab로 3개
    • 종류가 3개, 개수는 a, b, c개 → 입을 수 있는 경우의 수는 a, b, c, ab, bc, ac, abc로 7개
  • 즉, 각 종류의 개수 + 1 를 다 곱해준 뒤 -1 해주면 된다는 것을 알았다.
//시간: 0.12ms
//메모리: 87.1MB

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        HashMap<String, List<String>> map = new HashMap<>();
        for (String[] cloth : clothes) {
            String name = cloth[0];
            String category = cloth[1];
            if (map.containsKey(category)) {
                map.get(category).add(cloth[0]);
            } else {
                List<String> list = new ArrayList<>();
                list.add(cloth[0]);
                map.put(cloth[1], list);
            }
        }

        Iterator iter = map.keySet().iterator();
        while (iter.hasNext()) {
            int size = map.get(iter.next()).size();
            answer *= (size + 1);
        }

        return answer - 1;
    }
}

두 번째 풀이

  • 첫 번째 풀이를 풀다보니, 옷의 종류마다 몇 개의 옷을 가지고 있는지가 중요하지 어떤 옷이 있는지를 알 필요가 없다는 걸 알았다.
  • 그래서 HashMapValue 로 종류별 개수를 넣을 수 있도록 바꾸었다.
  • map.put(category, map.getOrDefault(category, 0) + 1);
    • map.getOrDefault(cateory, 0)category 가 존재하면 Value 를, 존재하지 않으면 0 을 리턴한다.
    • 그리고 위의 값을 다시 동일한 categorykey 로 가지는 value 로 넣을 때, 1 을 더해준다. (종류별 개수가 하나 증가했기 때문)
//시간: 0.15ms
//메모리: 82.5MB

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        HashMap<String, Integer> map = new HashMap<>();
        for (String[] cloth : clothes) {
            String category = cloth[1];
            map.put(category, map.getOrDefault(category, 0) + 1);
        }

        Iterator iter = map.keySet().iterator();
        while (iter.hasNext()) {
            answer *= (map.get(iter.next()) + 1);
        }

        return answer - 1;
    }
}

© 2021. All rights reserved.

yaejinkong의 블로그