문제 해석
참가자는 완주자보다 -1 작을것이라는 것에서 이건 무조건 큰것에서 작은것을 빼다보면 남는것을 출력하면 문제가 해결될 것으로 곧바로 생각이 되었다.
이전 문제에서 해시맵을 사용했기 때문에 해시맵에 각 배열 요소들을 저장해서, 큰 맵에서 작은 맵의 요소들을 하나씩 검색해서 빼기로 했다.
문제 풀이
처음엔 동명이인에 대한 처리를 어떻게 해야 할 지 애매했다. 다른 풀이를 참고하면서 Map의 메소드 중 getOrDefault()라는 메소드를 확인하게 되었다.
키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드로
getOrDefault(Object key, V DefaultValue)
반환 값 : 찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환되는 것이다.
풀어쓰면 동일한 이름이 있으면 value가 1증가하게 되도록 된 것이다.
참가자 맵인 comMap에서 name을 추출해서 완주자 parMap에서 존재하지 않는것을 체크하면서 그 이름을 반환한다.
또한 comMap.get(name) > parMap.get(name)는 동명이인인 경우에 혹시 참가자가 동일한 이름이 2명이면 1, 완주자는 0으로 나타날 수 있어서 그런 경우 그 동명이인 참가자가 완주하지 못했을 것을 체크하는 부분이다.
동명이인에 대한 처리를 어떻게 해야 할 지 바로 생각나지 않을 것 같다. 여러 연습을 해봐야 할 것 같다.
import java.util.HashMap;
public class Solution3 {
public String solution(String[] completion, String[] participant){
HashMap<String, Integer> comMap = new HashMap<>();
HashMap<String, Integer> parMap = new HashMap<>();
// completion 배열의 이름을 completionMap에 추가
for (String name : completion) {
//comMap.put(name, 1); // 동명이인에 대한 처리가 안된다..
// 동명이인에 대한 처리는 다른 자료 참고
comMap.put(name, comMap.getOrDefault(name, 0) + 1);
}
// participant 배열의 이름을 participantMap에 추가
for (String name : participant) {
//parMap.put(name, 1);
parMap.put(name, parMap.getOrDefault(name, 0) + 1);
}
// 두 맵을 비교하고 빼기
for (String name : comMap.keySet()) {
if (!parMap.containsKey(name) || comMap.get(name) > parMap.get(name)) {
return name;
}
}
return "Nobody's left";
}
public static void main(String[] args){
Solution3 sol = new Solution3();
String[] completion = {"leo", "kiki", "eden"};
String[] participant = {"eden", "kiki"};
System.out.println(sol.solution(completion, participant));
}
}
Java
복사