본문 바로가기
Study Log/Algorithm

Programmers / Hash - 완주하지 못한 선수

by HZie 2021. 4. 6.

programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

[참고한 코드]

// 다른 사람의 풀이
import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> hm = new HashMap<>();
        for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
        for (String player : completion) hm.put(player, hm.get(player) - 1);

        for (String key : hm.keySet()) {
            if (hm.get(key) != 0){
                answer = key;
            }
        }
        return answer;
    }
}

[내가 짠 코드]

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> map = new HashMap<>();
        
        for(String player:participant)
            map.put(player, map.getOrDefault(player,0) + 1);
        for(String player: completion)
            map.put(player, map.getOrDefault(player,0) -1);
        
        for(Map.Entry<String, Integer> entry:map.entrySet())
            if(entry.getValue() > 0){
                answer = entry.getKey();
                break;
            }
            
        
        return answer;
    }
}

 

[배운 것]

* hm.getOrDefault(key, defaultVal)

:  key값이 있으면 그 키에 해당하는 val 값을 리턴하고, 없으면 해시맵에 defaultVal 리턴한다.

 

* 해시맵의 모든 <Key, Value> 쌍을 가져올 때

: 두 가지 방법이 있다.

1) keySet()을 한 후 get(key)를 하는 것

2) entrySet()을 이용하는 것 

1번의 방법이 더 떠올리기는 쉬울 수 있으나 효율성 면에서는 entrySet()을 이용하는 것이 낫다.

1번의 경우 keySet()함수를 호출하면서 mapSize만큼의 시간이 걸리고, get()함수를 호출함으로써 hashcode()와 equals()함수도 호출하게 된다. 반면 2번의 경우 entrySet()을 호출하면 모든 <key, val> 값을 가져오는데 mapSize만큼의 시간이 걸린다.

 

--> 1) n + n*(hashcode + equals)

     2) n

출처: stackoverflow.com/questions/3870064/performance-considerations-for-keyset-and-entryset-of-map

 

댓글