
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
| participant | completion | return |
|---|---|---|
| [leo, kiki, eden] | [eden, kiki] | leo |
| [marina, josipa, nikola, vinko, filipa] | [josipa, filipa, marina, nikola] | vinko |
| [mislav, stanko, mislav, ana] | [stanko, ana, mislav] | mislav |
participant를 순서대로 탐색하며 이름을 key, 등장횟수를 value로 증가시키며 저장한다.completion을 순서대로 탐색하며 완주한 이름에 대해 value를 감소시킨다.동명이인이 있을 수 있다는 조건 빼먹고 Set으로 풀었다가 다시 Map으로 풀었다!^^ 문제 조건을 꼼꼼히 읽자~
그리고 원래 1번을 한 줄로 쓰지 않았고, if문으로 이미 key가 존재하는지 체크해서 value를 get하고 증가시켜서 다시 put하는 방식으로 코드를 짰었다. 정말 가독성 떨어지는 비효율적인 코드다.
그러다 다른 사람의 풀이에서 getOrDefault라는 메소드를 봤고, 2줄 짜리를 한 줄 안에 깔끔하고 명확하게 넣을 수 있게 되었다. Map interface에만 있는 메소드인 것 같은데, 이렇게 또 몰랐던 메소드를 하나 더 배워 간다!
import java.util.HashMap;
import java.util.Map;
class Solution {
public String solution(String[] participant, String[] completion) {
Map<String, Integer> participants = new HashMap<>();
for (String person : participant) participants.put(person, participants.getOrDefault(person, 0) + 1);
for (String person : completion) participants.put(person, participants.get(person) - 1);
return participants.entrySet().stream().filter(entry -> entry.getValue() != 0).findFirst().get().getKey();
}
}