🔗 https://school.programmers.co.kr/learn/courses/30/lessons/42576
1. 접근방식 / 설계
단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열participant
와 완주한 선수들의 이름이 담긴 배열completion
이 주어질 때,완주하지 못한 선수의 이름
을 return.
completion
을map
으로 변환.
다만 동명이인을 고려해서{ completion : cnt }
형식으로 구성.participant
요소만큼 순회하면서participant
가completion
에 존재하는지 체크.- 존재하는 경우 ⇒
cnt -= 1
cnt
가 0이 됐다면key
에 해당하는 참가자들이 모두 완주한 것이므로map
에서 삭제.- 0이 아니라면 동명이인의 완주자가 더 존재하는 것이므로
val - 1
값을 다시map
에 재할당.
- 미존재 ⇒
answer
경우의 수- 아예
completion
에 존재하지 않는 참가자 - 동명이인이 존재하면서 완주하지 못한 참가자
⇒ 완주한 동명이인을 모두 체크하여if(val == 0) map.remove(str);
을 하고 난 이후에도 해당key
를 가진 참가자가for문
을 순회한다면 해당 참가자는 동명이인 중에서도 완주하지 못한 참가자임을 의미하므로,map.get(동명이인 참가자) == null
이 되면서 정답이 된다.
- 아예
- 존재하는 경우 ⇒
2. 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.*;
import java.util.stream.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
Map<String, Integer> map = new HashMap<>();
int cnt = 1;
for(String str : completion) {
cnt = map.getOrDefault(str, 1);
if(map.containsKey(str)) cnt += 1;
map.put(str, cnt);
}
Integer val = null;
for(String str : participant) {
val = map.get(str);
if(val == null) {
answer = str;
break;
}
else {
val = val-1;
if(val == 0) map.remove(str);
else map.put(str,val);
}
}
return answer;
}
}
3. 다른 방식 코드 분석
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
class Solution {
public String solution(String[] participant, String[] completion) {
Map<String, Long> participantMap = Arrays.asList(participant).stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
for(String name : completion) {
Long value = participantMap.get(name) - 1L;
if(value == 0L) {
participantMap.remove(name);
} else {
participantMap.put(name, value);
}
}
return participantMap.keySet().iterator().next();
}
}