코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.
예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.
종류 | 이름 |
---|---|
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
clothes | return |
---|---|
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]] | 3 |
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.
1. yellow_hat
2. blue_sunglasses
3. green_turban
4. yellow_hat + blue_sunglasses
5. green_turban + blue_sunglasses
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.
1. crow_mask
2. blue_sunglasses
3. smoky_makeup
HashMap을 이용하여 의상의 타입별로 갯수를 카운트를 해주면 된다.
type.put(temp[1], type.getOrDefault(temp[1], 1) + 1);
이때 default 값이 1부터 시작한 이유는 한개의 의상을 입거나 안입는 경우 총 2개부터 시작이기 때문이다.
또한 이 문제를 조금만 생각해보면 Hashmap 에서 구한 value 값들의 곱이 정답이 된다는 것을 알 수 있다.
경우의 수를 생각해보면 금방 도출 해낼 수 있다.
마지막에 join - 1
한 이유는 적어도 한개의 의상은 입어야 하기 때문에 모두 안입는 경우 1개를 빼주면 된다.
import java.util.*;
class Solution {
public int solution(String[][] clothes) {
HashMap<String, Integer> type = new HashMap<>();
for(String[] temp : clothes){
type.put(temp[1], type.getOrDefault(temp[1], 1) + 1);
}
int join = 1;
for(String temp : type.keySet()){
int num = type.get(temp);
join *= num;
}
return join - 1;
}
}