[プログラマー][java]完走できなかった選手


質問リンク-https://programmers.co.kr/learn/courses/30/lessons/42576
  • ソリューション
  • まず、問題の条件下で、完了した長さは参加者の長さより1小さいことに気づいた.
    1ほど小さいので、完了時に参加者の名前が一つもない場合は、すぐに戻ればいいし、すべてある場合は、参加者は重複する人の名前を返せばいい.
    これを実現するには、参加者の名前と名前を知る必要があります.
    2 D配列として保存し、比較は完了したが、効率は通過しなかった-
    この問題を解決するために,データ構造を検索する際にhash関数を用いてkey−valueを迅速に検索できるhashmapを発見し,使用した.
    hashMapのkeyは名前を表し、valueは同じ名前が何回繰り返されるかを表す.
    重複する名前がある場合は、2として保存します.-
    最後に、完成中でない人を見つけるために、繰り返し文を使います
    完了時に存在するユーザはもちろん参加者に存在する.
    各参加者の値(何人いるか)から1を減算します.
    したがって,0(完了1名,参加者1名)である.
    1(完了1名、参加者2名、または完了0名、参加者1名)を使用して値1を検索し、キー値を返します.
  • import java.util.*;
    
    class Solution {
        public String solution(String[] participant, String[] completion)     {
            
            Map<String,Integer> part = new HashMap<>();
            
            for(String name: participant){ //저장
                if(part.get(name)==null) part.put(name,1);
                else part.put(name,part.get(name)+1);
                //part.put(name,part.getOrDefault(name,0)+1); null처리를 쉽게
            }
            
            for(String name: completion){ //completion과 비교, -1
                part.put(name,part.get(name)-1);
            }
            
            for(String key:part.keySet()){ // 0이 아닌 것(1)을 찾는다!
                if(part.get(key)!=0) return key;
            }
            
            return "";
        }
    }