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
'Study Log > Algorithm' 카테고리의 다른 글
Programmers / 정렬 - 가장 큰 수 (0) | 2021.04.18 |
---|---|
Programmers / 정렬 - K번째 수 (0) | 2021.04.17 |
카카오 2020 블라인드 채용 1차 코딩테스트 4번 문제 - 가사 검색 (0) | 2020.09.11 |
카카오 2020 블라인드 채용 1차 코딩테스트 3번 문제 - 자물쇠와 열쇠 (0) | 2020.09.07 |
카카오 2020 블라인드 채용 1차 코딩테스트 2번 문제 - 괄호 변환 (0) | 2020.09.05 |
댓글