📝 문제

https://programmers.co.kr/learn/courses/30/lessons/42578?language=java

🎯 풀이

점화식을 찾아내면 Hash는 그저 배열 분류용도로만 사용된다.

((모자개수 + 1) * (하의개수 + 1) * (겉온개수 + 1) * …) - 1

Hash의 value로 들어간 list나 array의 길이값+1을 계속 곱하고
마지막에 1을 차감해서 반환하면 정답이 된다.

import java.util.*;
import java.util.Map.Entry;
class Solution {
    public int solution(String[][] clothes) {
        // String, List 자료형 HashMap 선언.
        HashMap<String, List> spy = new HashMap<>();
        for (int i = 0; i < clothes.length; i++) {
            List<String> wear;
            // 아직 추가되지 않은 분류라면?
            if (!spy.containsKey(clothes[i][1])) {
                wear = new ArrayList(); // wear List 생성.
                spy.put(clothes[i][1], wear);   // HashMap에 추가!
            }
            wear = spy.get(clothes[i][1]);  // 분류에 해당되는 List 가져오기.
            wear.add(clothes[i][0]);        // List에 옷 추가.
            spy.put(clothes[i][1], wear);   // 다시 집어 넣기.
        }
        int answer = 1;
        for (Entry<String, List> s : spy.entrySet()) {
            answer *= s.getValue().size()+1;    // 점화식 적용!
        }

        return answer - 1;
    }
}

👏 더 나은 풀이

import java.util.HashMap;
import java.util.Iterator;
class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        HashMap<String, Integer> map = new HashMap<>();
        for(int i=0; i<clothes.length; i++){
            String key = clothes[i][1];
            if(!map.containsKey(key)) {
                map.put(key, 1);
            } else {
                map.put(key, map.get(key) + 1);
            }
        }
        Iterator<Integer> it = map.values().iterator();
        while(it.hasNext()) {
            answer *= it.next().intValue()+1;
        }
        return answer-1;
    }
}

어차피 중복되는 옷은 존재하지 않으므로 그냥 정수로 계산해도 됐다.
이런…

댓글남기기