[프로그래머스]위장/JAVA(자바)

우니·2022년 12월 22일
0

문제 링크 : 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()을 사용하는게 효율적이다.

0개의 댓글