답에 대한 의견이 많아서 흥미진진한 문제이다.
의견이 가장 많은 두가지 답안을 살펴보자!
첫번째 답은 hash를 쓰지 않고 푼 답안이다.
import java.util.*;
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];
}
}
이 답안의 핵심은 i를 for문 밖에서 선언해주었다는 것이다.
완주하지 못한 선수가 배열의 맨 마지막에 있을 경우를 대비하여 만든 장치라고 생각할 수 있다.
이 답안이 효율성이 좋지 못할 확률이 있는 점은, sort를 사용하여 정렬하였기 때문에 정렬하는 시간이 오래 걸릴 수 있다.
두번째 답안은 문제에서 사용하라는 hash를 쓴 답안이다.
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;
}
}
getOrDefault라는 생각하지 못했다.
getOrDefault(Object key, V defaultValue) → key값을 hash내에서 찾아내 맵핑된 값을 찾아온다. 만약 키값이 없으면 지정한 기본값 리턴
여기서 getOrDefault를 굳이 쓰는 이유는 동명이인의 선수를 고려하기 위해서이다....!(똑똑쓰
즉, completion에 존재하는 선수의 value값은 0이고 그렇지 않은 선수의 value값은 0이상일 것이다.
마지막 for문에 대해서 지적한 댓글을 보았는데, 바로 keySet()에 대한 issue였다.
keySet()는 전체 키를 불러온다. 굳이 키를 불러와 그 키에 맵핑된 value를 찾기보다,,
entrySet()이라는 키와 value를 동시에 불러오는 함수를 사용하는 것이 더 올바른 답안이라는 의견이였다.
key,value동시에 가져올 때는 entryset을 사용하도록 하자.
이 답안의 제시되는 문제로 hash에 담는 시간이 오래걸리지 않겠냐는 것이다.
이렇게 되면 두가지를 비교하게 되는데
바로(( hash에 값을 담는 시간 vs sort하는 시간 )) 어떤 것이 더 오래걸리고 비효율적일까...
아마 sort하는 시간이 더 걸릴 것 같다....!
'Computer Engineering > 알고리즘 테스트' 카테고리의 다른 글
프로그래머스 코딩테스트 문제: 스파이 (0) | 2020.03.06 |
---|---|
프로그래머스 코딩테스트 문제: K번째수 (0) | 2020.03.06 |
프로그래머스 코딩테스트 문제: 폰켓몬 (0) | 2020.03.05 |
프로그래머스 코딩테스트 문제: 제일 작은 수 제거하기 (0) | 2020.03.04 |
프로그래머스 코딩테스트 문제: 주식가격 (0) | 2020.03.04 |