이번 문제는 map의 getOrDefault()를 잘 활용하면 쉽게 풀 수 있는 문제였다.
- 참가자 배열 처리 : 먼저 모든 참가자의 이름을 map에 키값으로 저장한다. 이 때 이미 있는 참가자의 경우 값을 (등장횟수)를 1 증가시킨다.
for(String runner : participant) {
runners.put(runner, runners.getOrDefault(runner, 0) + 1);
}
- 완주자 배열 처리 : 참가자 배열 처리와 마찬가지로 진행한다.
for(String complete : completion) {
completes.put(complete, completes.getOrDefault(complete, 0) + 1);
}
- 미완주자 식별 : 참가자와 완주자를 처리해준 map에서 똑같은 키 값으로 가져온 값을 비교한다.
이 때 참가자의 값보다 완주자의 값이 작을 때에 그 키 값의 이름을 가진 사람이 완주하지 못하는 사람이다.
for(Map.Entry<String, Integer> entry : runners.entrySet()) {
String key = entry.getKey();
int count1 = entry.getValue();
int count2 = completes.getOrDefault(key, 0);
if(count1 > count2) {
answer = key;
break; // 찾으면 루프 종료
}
}
이렇게 진행하는 이유는 동명이인이 존재했을 때 map에 그냥 값을 넣게 되면 덮어씌워지기 때문에 등장횟수를 값으로
설정을 한 후에 진행을 해야한다.
아래는 전체 코드이다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
Map<String, Integer> runners = new HashMap<>();
Map<String, Integer> completes = new HashMap<>();
for(String runner : participant) {
runners.put(runner, runners.getOrDefault(runner, 0) + 1);
}
for(String complete : completion) {
completes.put(complete, completes.getOrDefault(complete, 0) + 1);
}
for(Map.Entry<String, Integer> entry : runners.entrySet()) {
String key = entry.getKey();
int count1 = entry.getValue();
int count2 = completes.getOrDefault(key, 0);
if(count1 > count2) {
answer = key;
}
}
return answer;
}
}