이 문제가 해시 카테고리에 있는 문제인데, 처음에 까먹고 다른 방법으로 풀었다. 그리고 해시맵을 이용해서도 다시 풀어 총 2가지 방법으로 풀었다.
우선 해시맵을 이용하지 않고 participant
와 completion
을 각각 정렬한다. 정렬을 하는 이유는 두 배열을 순차탐색하여 비교하기 위해서이다. 두 배열은 무조건 한사람을 제외하고는 똑같다. 그래서 같은 인덱스의 participant
와 completion
에 있는 요소가 다르다면 이것은 participant
에 있는 요소가 completion
에는 없기 때문일 것이다. 즉, 이 요소가 완주하지 못한 선수이다. 이 선수를 temp에 저장한다.
그런데 만약 완주하지 못한 선수가 맨 끝에 있다면 temp에는 아무것도 없을 것이다. 따라서 이 때는 participant
의 제일 마지막 요소를 넣어준다.
class Solution {
public String solution(String[] participant, String[] completion){
Arrays.sort(participant);
Arrays.sort(completion);
String temp="";
for (int i=0;i<completion.length;i++) {
if (!participant[i].equals(completion[i])) {
temp=participant[i];
break;
}
}
if (temp.equals(""))
temp=participant[participant.length-1];
return temp;
}
}
사실 해시맵을 처음 사용해봐서 조금 헤맸다. HashMap
은 일단 key-value
의 쌍을 저장하는 자료구조이다. 여기서는 참가자들의 이름을 key에 저장하고 value에는 그 이름을 가진 참가자의 수를 저장한다. 예를들어 "kiki"라는 동명이인이 3명 있다면 kiki의 value값은 3이다.
그리고 completion
배열을 순차탐색하여 completion
내의 선수이름과 같은 key를 가진 요소의 vaule값을 1씩 줄인다. 완주한 선수들을 제거하는 것이다. 이 반복문을 모두 돌고나면 1명을 제외한 모든 key의 value값이 0이 될것이다. 따라서 value가 0이아닌 key가 완주하지 못한 선수가 된다!
class Solution {
public String solution(String[] participant, String[] completion) {
Map<String,Integer> par = new HashMap<>();
String answer="";
for (String i: participant)
par.put(i,par.getOrDefault(i,0)+1);
for (int i=0;i<completion.length;i++) {
par.put(completion[i],par.get(completion[i])-1);
}
Iterator<String> iter = par.keySet().iterator();
while (iter.hasNext()) {
String key = iter.next();
if (par.get(key)!=0) {
answer=key;
}
}
return answer;
}
}
Map.getOrDefaultValue(key,defaultValue)
- 찾고자 하는 key가 Map에 존재하면 해당 value를 반환
- 없다면 defaultValue를 반환