public int solution(String[][] clothes) {
HashMap<String, Integer> hs = new HashMap<>();
for (String[] clothe : clothes) {
String type = clothe[1];
hs.put(type, hs.getOrDefault(type, 0) + 1);
}
int sum = 0;
int mul = 1;
for (Integer value : hs.values()) {
sum += value;
mul *= value;
}
return sum + mul;
}
문제 읽자마자 바로 떠올려서 구현했다.
의상의 상세한 이름은 중요하지 않고 종류에 따른 개수가 몇개인지만 중요한것 같아서
hashmap을 써서 종류와 그의 개수를 count 하는 식으로 짰다.
이전 해시 문제에서 배웠던 getOrDefault를 잘 활용한 것 같아 매우 만족했다.
하지만 최종 결과를 산출할 때, 이렇게 하면 하나의 type만 있는 경우에도 multiply 계산이 적용되어
원하는 결과가 나오지 않았다
예를 들면,
[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]]
위의 경우, face만 3개 이므로 더하기 계산만 이루어지고 곱에서는 0 으로
3 + 0 = 3 이 나와야 하는데 기본 mul = 1로하여 3 + 3 = 6 이 나오게 된다.
그럼 저 로직은 그대로 두고 + mul를 해주는 조건을 추가해보자.
type 이 한 개 일때가 특수 케이스 이므로, type이 1개인 것을 낚아채는 로직을 생각하면 된다.
public int solution(String[][] clothes) {
HashMap<String, Integer> hs = new HashMap<>();
for (String[] clothe : clothes) {
String type = clothe[1];
hs.put(type, hs.getOrDefault(type, 0) + 1);
}
int sum = 0;
int mul;
if (hs.size == 1) mul = 0;
else mul = 1;
for (Integer value : hs.values()) {
sum += value;
mul *= value;
}
return sum + mul;
}
hs의 size를 통해 type의 개수를 파악했다.
TC는 성공하지만 제출시 실패하는 문제가 꽤 많았따.. 뭐가 문제일까
이 같은 로직의 오류를 고등학교 확통공부할 때도 만난적이 있는거같다..
모자 3 상의 2 하의 1 일 경우
한 개씩 입는 경우 : 3 + 2 + 1 = 6 (위 로직의 sum에 해당)
두 개 이상씩 조합해서 입는 경우: 3 x 2 x 1 = 6 (위 로직의 mul에 해당)
이렇게 하면 6 + 6 = 12가 나오게 되는데,
두 개 이상씩 조합할 경우를 나눠서 생각해보면
두 개 입을 경우 = 3 x 2 + 3 x 1 + 2 x 1 = 11
세 개 입을 경우 = 3 x 2 x 1 = 6
총 17개의 경우이므로 위에 한 개만 입을때를 더하면 6 + 17 = 23이 나오게 된다.
즉, 전체의 경우에서 모두다 입지 않는 경우인 1 을 빼주는 것이 더 이상적인 풀이방법이자
내가 고등학교때 확률 문제를 풀었던 일반적인 경우이다.
모자 3 상의 2 하의 1 일 경우
각 개수에 하나씩 더해서 모두 곱하자 = 4 x 3 x 2 = 24
모두 다 입지 않는 경우인 1을 뺴자 24-1 = 23
public int solution(String[][] clothes) {
HashMap<String, Integer> hs = new HashMap<>();
for (String[] clothe : clothes) {
String type = clothe[1];
hs.put(type, hs.getOrDefault(type, 0) + 1);
}
int mul = 1;
for (Integer value : hs.values()) {
mul *= (value + 1);
}
return mul - 1;
}