이번에는 아주 유명?한 문제를 풀어볼 예정이다.
https://school.programmers.co.kr/learn/courses/30/lessons/42576?language=java#

해당 문제에서 가장 중요한 부분은 참가자 중 동명이인이 존재할 수 있다 이 부분이다.
3번 예시에 동명이인이 존재하고 둘중 한 명만 완주에 성공한 것을 볼 수 있다.
그리고 이 문제의 태그에 해시가 붙어있는데 해시의 대표적인 예시 문제로 유튜브에 많이 보였다.
해시와 동명이인 처리 부분을 주의깊게 보고 문제를 풀어보자
먼저 해시맵을 생성할 예정이다.
HashMap<String, Integer> completMap = new HashMap<>();
해당 맵은 "이름" : 몇명 의 Key : Value 의미를 담은 맵이다
몇명인지 저장함으로써 동명이인의 유무를 파악할 수 있다.
이제 완주한 선수 명단을 맵에 저장할 예정이다.
for (String com : completion) {
completMap.put(com, completMap.getOrDefault(com, 0) + 1);
}
완주자 명단만을 순회하여 생성해둔 맵에 저장한다.
이 때 사용되는 것이 바로 getOrDefault인데 completMap.getOrDefault(com, 0)
딱 이 부분을 분해 해보면 다음과 같이 풀 수 있다.
get(com) 을 진행해서 Value가 나온다면 그 값을 사용하고,
get(com) == null 일 경우에는 0으로 저장할게
따라서 위의 코드는 이미 존재하는 코드
completMap.put(com, completMap.getOrDefault(com, 0) + 1);
를 풀어보자면
중복된 이름 없이 처음 들어온 주자는 "이름" : 0 + 1 로 저장하고,
중복된 이름이 있다면 "이름" : 1 + 1 로 저장한다.
이제 참가자를 순회하면서 완주하지 못한 주자를 찾아야 한다.
for (String part : participant) {
completMap.put(part, completMap.getOrDefault(part, 0) - 1);
if (completMap.get(part) == 0) {
completMap.remove(part);
}
}
해당 부분에 대한 코드는 위에서 설명을 다 했기 때문에 굳이 더 하지 않도록 하겠다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
HashMap<String, Integer> completMap = new HashMap<>();
// 완주한 선수 명단을 맵에 저장
for (String com : completion) {
completMap.put(com, completMap.getOrDefault(com, 0) + 1);
}
// 참가자를 순회하며 완주하지 못한 사람 찾기
for (String part : participant) {
completMap.put(part, completMap.getOrDefault(part, 0) - 1);
// 값이 0이 되면 제거
if (completMap.get(part) == 0) {
completMap.remove(part);
}
}
// 완주하지 못한 선수는 유일하게 맵에 남아있는 key
return completMap.keySet().iterator().next();
}
}