



경우의 수를 조합으로 풀면 된다.
안 입는 경우를 포함해서 옷의 종류 당 개수를 모두 곱한다.
옷의 종류를 모두 안 입는 경우 1가지를 뺀다.
대부분의 경우, K << N 이므로 사실상 시간 복잡도는 O(N)에 가깝다.
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
HashMap<String, Integer> map = new HashMap<>();
// 종류별로 몇 개씩 있는지 저장
for(String[] cloth : clothes) {
String key = cloth[1]; // 옷 종류
map.put(key, map.getOrDefault(key, 0) + 1); // map(옷 종류, 옷 개수)
}
// 옷 종류가 1개일 때
if(map.keySet().size() == 1)
return clothes.length;
int answer = 1;
for (String key : map.keySet()) {
// 서로 독립적인 선택을 하는 경우, 경우의 수는 곱한다는 조합의 기본 원리
answer *= (map.get(key) + 1); // key : 각 종류마다 옷 개수, +1 : 안 입는 경우
// headgear : 총 3가지 (안입음, yellow_hat, green_turban)
// eyewear: 총 2가지 (안입음, blue_sunglasses)
}
answer -= 1; // 모두 안 입는 경우 1개 제거
return answer;
}
}