[Programmers]-완주하지 못한 선수(해시)
문제
“코딩테스트 고득점 Kit - 해시” 문제이다.
코드
import java.util.Arrays;
class Solution {
public String solution(String[] participant, String[] completion) {
Arrays.sort(participant);
Arrays.sort(completion);
int i;
for(i=0;i<completion.length;i++){
if(!participant[i].equals(completion[i])) return participant[i];
}
return participant[i];
}
}
코드 설명
처음에 이렇게 풀었다.
하지만 해시문제답게 해시로 푸니 더 빠르다.
코드
import java.util.HashMap;
class Solution {
public String solution(String[] participant, String[] completion) {
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) return key;
}
return "";
}
}
코드 설명
이렇게 해시맵을 써주면 효율성에서 4~5배 차이가 보인다.
아무래도 정렬에서 시간이 길어지는 것 같다.
이 코드는 getOrDefault가 핵심이 된다.
getOrDefault(key, defaultValue)는 해시맵에 key가 있으면 key의 value를 반환하고 없으면 defaultValue를 반환한다. 이렇게 첫for문의 key에는 이름, value에는 이름 갯수가 나타난다.
두번 째 for문에서는 중복되면 value-1 해준다.
중복이 안되면 못들어온 사람이니 찾으면 된다.
요약
- getOrDefault(key, defaultValue) : 해시맵에 key가 있으면 key의 value반환, key가 없으면 defaultValue 반환.