문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42578
전형적인 해시 문제다.
뭔가 문자로 된 분류값 안에 항목들을 넣어야할때는 해시로 풀어주고 있다.
예를 들면 과일 : 사과, 포도, 딸기 등등 이렇게 분류해야할때..
전체 코드
import java.util.HashMap;
import java.util.Map.Entry;
class Solution {
public int solution(String[][] clothes) {
int answer = 1;
HashMap<String, Integer> map = new HashMap<>();
for(int i = 0; i < clothes.length; i++){
map.put(clothes[i][1], map.getOrDefault(clothes[i][1], 0 ) + 1);
}
for (Entry<String, Integer> entry : map.entrySet()) {
answer *= (entry.getValue() + 1);
}
//System.out.print(map);
return answer -1 ;
}
}
코드를 한줄 한줄 설명해보자면
먼저 clothes 배열을 돌면서 해시 맵에 추가해준다.
getOrDefault 함수를 사용해서 해시 맵에 key가 있으면 값에 +1를 해주고 없다면 디폴트 값인 0을 넣어준다.
for(int i = 0; i < clothes.length; i++){
map.put(clothes[i][1], map.getOrDefault(clothes[i][1], 0 ) + 1);
}
해시 맵에 다 넣어줬으면 이제 맵의 모든 key-value 쌍을 순회해야한다.
keySet()을 사용하는 경우가 많은데, 다른 분의 풀이를 보다가 keySet()가 아닌 entrySet()을 사용하는게 더 좋다는 걸 알았다. 그 이유는 밑에.
for (Entry<String, Integer> entry : map.entrySet()) {
answer *= (entry.getValue() + 1);
}
keySet()을 사용하는 경우 모든 key에 대해 일일히 get() 메서드를 호출하고 이 메서드는 hash() 메서드를 사용하기 때문에 entrySet에 비해 속도면에서 비효율적이다.
그에 반해 entrySet은 value까지 Set에 담아주기 때문에 따로 get메서드를 일일히 호출하지 않는다.
그래서 entrySet()을 사용하는게 효율적이다.