🔗 https://school.programmers.co.kr/learn/courses/30/lessons/42576

1. 접근방식 / 설계

단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return.

  1. completionmap으로 변환.
    다만 동명이인을 고려해서 { completion : cnt } 형식으로 구성.
  2. participant 요소만큼 순회하면서 participantcompletion 에 존재하는지 체크.
    • 존재하는 경우 ⇒
      1. cnt -= 1 cnt 가 0이 됐다면 key 에 해당하는 참가자들이 모두 완주한 것이므로 map 에서 삭제.
      2. 0이 아니라면 동명이인의 완주자가 더 존재하는 것이므로 val - 1 값을 다시 map 에 재할당.
    • 미존재 ⇒ answer 경우의 수
      1. 아예 completion 에 존재하지 않는 참가자
      2. 동명이인이 존재하면서 완주하지 못한 참가자
        ⇒ 완주한 동명이인을 모두 체크하여 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();
    }
}

4. 관련된 개념 공부