HashMap에 정리완주한 선수들(completion 배열)을 HashMap에 위와 같이 넣는다. 완주한 선수들 중에서도 동명이인이 있을 수 있으니 해당 선수의 이름이 map에 존재하지 않으면 value로 1을 넣고, 이미 존재하면 value로 (기존의 value) + 1을 넣는다.
for (int i = 0; i < completion.length; i++) {
if (!map.containsKey(completion[i])) {
map.put(completion[i], 1);
}
else {
map.put(completion[i], map.get(completion[i]) + 1);
}
}
참가자들(participant 배열)을 돌면서 해당 선수가 map에 있는지를 확인한다. 완주하지 못한 선수가 되는 조건은 두가지가 있다.
map의 key에 이름이 없는 선수 -> !map.containsKey(participant[i])map의 value가 0인 선수 -> map.get(participant[i]) == 0두번째 조건은 동명이인 때문에 넣은 조건이다. 동명이인이 있는데 한 명은 완주하고, 한 명은 완주하지 못한 경우 완주한 선수들을 정리한 map의 key에는 이름이 존재한다. 그러나 완주한 선수는 한 명이기 때문에 해당 key에 대한 value는 1이 된다.
위의 두가지 조건에 모두 해당되지 않는 경우는 해당 이름을 가진 선수 한 명이 통과했다는 의미로 선수 이름에 대한 value에 (기존의 value) - 1을 넣는다. 동명이인의 경우에는 한 명이 통과하여 (기존의 value) - 1을 하면 value가 0이 되므로 다른 한 명은 두번째 조건에 걸려 완주하지 못한 선수를 찾아낼 수 있다.
for (int i = 0; i < participant.length; i++) {
if (!map.containsKey(participant[i]) || map.get(participant[i]) == 0) {
answer = participant[i];
break;
}
map.put(participant[i], map.get(participant[i]) - 1);
}
동명이인을 고려하지 않아 3번 테스트 케이스에 걸렸다. 문제를 꼼꼼히 읽자.