참조한 블로그와 차이점이 있다면 keySet을 사용하지 않고 entrySet을 사용했다는 점입니다.
사용 이유는 아래 주석을 참조하시면 됩니다.
public static String solution(String[] participant, String[] completion) {
String answer=null;
HashMap<String, Integer> hm = new HashMap<String,Integer>();
//참가자의 key : value 테이블을 만든다. value값에 1로 바꾼다.
for(String player : participant)
hm.put(player, hm.getOrDefault(player, 0)+1);
//완주한 참가자의 value값을 -1해준다
for(String player : completion)
hm.put(player, hm.getOrDefault(player, 0)-1);
//완주하지 못한 참가자는 value값이 1이므로 반복문과 조건문으로 필터링하여 리턴해준다.
//EntrySet을 이용하여 hashmap값을 set값으로 반환
//entrySet()을 이용하면 맵의 모든 쌍을 반복할 때 keySet()에 비해 entrySet()의 성능이 훨씬 더 좋다~
for(Entry<String, Integer> key : hm.entrySet()) {
if(key.getValue() != 0) {
answer = key.getKey();
break;
}
}
return answer;
}
public static void main(String[] args) {
String [] participant = {"mislav", "stanko", "mislav", "ana"};
String [] completion = {"stanko", "ana", "mislav"};
String s = solution(participant, completion);
System.out.println(s);
}
이 문제를 풀면서 몰랐던 메서드에 대해 간략히 정리하려고 합니다.
getOrDefault()입니다. 해당 메서드를 잘 정리한 블로그 분들 덕에 잘 이해할 수 있었습니다.
물론 docs도 확인했습니다. 아래는 docs에서 발췌했습니다.
default V getOrDefault(Object key, V defaultValue)
Returns the value to which the specified key is mapped, or defaultValue if this map contains no mapping for the key.
저는 이렇게 이해했습니다.
첫 번째 파라미터에 찾고자 하는 key를 넣어줍니다.
key와 매핑되어 있는 value가 없다면 default값을 반환하는데요 그 default값을 지정하는 게 두 번째 파라미터입니다.
있다면 key와 매핑된 value값이 리턴되겠죠??
아래 코드를 보시면
hm.put(player, hm.getOrDefault(player, 0)+1); 이렇게 코드를 작성한다면
아래 표처럼 된다고 생각하시면 편하실 겁니다.
key | value |
---|---|
mislav | 1 |
stanko | 1 |
mislav | 1 |
ana | 1 |
여기서 완주한 참가자의 value를 -1을 합니다.
hm.put(player, hm.getOrDefault(player, 0)-1);
그러면 아래 표처럼 mislav가 0이됩니다.
key | value |
---|---|
mislav | 0 |
stanko | 1 |
mislav | 1 |
ana | 1 |