2 분 소요

1. 완주하지 못한 선수

  • 수많은 마라톤 선수들이 마라톤에 참여하였습니다.
  • 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

주어지는 것

  • 마라톤에 참여한 선수들의 이름이 담긴 배열 participant
  • 완주한 선수들의 이름이 담긴 배열 completion

반환해야할 것

완주하지 못한 선수의 이름

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.
participant completion isCompleted i j participant[i] == completion[j] isCompleted return
[“mislav”, “stanko”, “mislav”, “ana”] [“stanko”, “ana”, “mislav”] [false, false, false] 0 0 false    
      0 1 false    
      0 2 true [false, false, true]  
      1 0 true [true, false, true]  
      2 0 false    
      2 1 false    
      2 2 false, (isCompleted ≠ false)   participant[2]

brute force

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        boolean[] isCompleted = new boolean[completion.length];
        
        for (int i = 0; i < participant.length; i++) {
            String part = participant[i];
            boolean isComp = false;
            for (int j = 0; j < completion.length; j++) {
                if (completion[j].equals(part) && isCompleted[j] != true) {
                    isCompleted[j] = true;
                    isComp = true;
                    break;
                }
            }
            if (!isComp) return participant[i];
        }
        return answer;    
    }
}

hash

participant completion HashSet i hashSet.contains(participant[i]) ? HashSet return
[“mislav”, “stanko”, “mislav”, “ana”] [“stanko”, “ana”, “mislav”] [“stanko”, “ana”, “mislav”] 0 (mislav) hashSet.remove(participant[i]) [“stanko”, “ana”]  
[“mislav”, “stanko”, “mislav”, “ana”, “mislav”] [“stanko”, “ana”, “mislav”, “mislav”]          
→ hashSet(“stanko”, “ana”, “mislav”)   1 (stanko) hashSet.remove(participant[i]) [“ana”]    
      2 (mislav) X   “mislav”
             
             
             
             
// 효율성 실패
public class Marathon {

    public static void main(String[] args) {
        Marathon m = new Marathon();
        String s = m.solution(new String[] {"mislav", "stanko", "mislav", "ana"}, new String[] {"stanko", "ana", "mislav"});
        System.out.println(s); // mislav

        s = m.solution(new String[] {"marina", "josipa", "nikola", "vinko", "filipa"}, new String[] {"josipa", "filipa", "marina", "nikola"});
        System.out.println(s); // vinko
    }

    public String solution(String[] participant, String[] completion) {
        Map<String, Integer> participantMap = toMap(participant);
        Map<String, Integer> completionMap = toMap(completion);

        for (String name: participantMap.keySet()) {
            if (completionMap.getOrDefault(name, 0) != participantMap.get(name)) {
                return name;
            }
        }
        return null;
    }

    private Map<String, Integer> toMap(String[] participant) {
        Map<String, Integer> map = new HashMap<>();
        for (String s : participant) {
            map.put(s, map.getOrDefault(s, 0) + 1);
        }

        return map;
    }
}