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



問題の説明


多くのマラソン選手がマラソンに参加した.1人の選手を除いて、すべての選手がマラソンを完走した.
マラソンに出場する選手の名前と完走した選手の名前の並びが完成したら、完走していない選手の名前を返す解決関数を書いてください.

せいげんじょうけん

  • マラソンに出場する選手は1人以上10万人以下.
  • 完了長さは参加者長1より小さい.
  • 参加者の名前は20文字を超えない.
  • の参加者には同名の人がいる可能性があります.
  • I/O例



    I/O例説明


    例1

  • 「leo」は参加者リストに載っていたが、完走者リストに載っていなかったため、完走しなかった.
  • 例2

  • 「vinko」は参加者リストに載っていたが、完走者リストには載っていなかったため完走しなかった.
  • 例#3

  • 「誤導」は参加者リストに2人いたが、完走したリストには1人しかいなかったため、1人は完走しなかった.
  • 私の答え


    ハッシュ問題であることに初めて気づいたが,ハッシュではなく繰り返し文をまず思いついた.
    いつこのようなアルゴリズム的な思考ができるのか...ほほほ
    まず,2つのアレイを第1の方法で配列した.sort()ソートを使用すると、0番目のインデックスから比較し、他のインデックスがある場合はインデックスを返し、インデックスに対応する参加者の配列値を返します.

    最初の解

    import java.util.*;
    
    class Solution {
        public String solution(String[] participant, String[] completion) {   
        	//배열 정렬
            Arrays.sort(participant);
            Arrays.sort(completion);
            
            //int i 선언 -> return 값에도 사용하기 때문에
            int i;
            
            for(i = 0;i<completion.length;i++){
            	//문자열 비교를 위해 .equals
                if(!completion[i].equals(participant[i])){
                    break;
                }
            }
            
            return participant[i];
        }
    }
    このように解くのは簡単ですが、ハッシュアルゴリズムでこの問題を解決したいと思います.
    だから考えているうちに、関数getOrDefault()を知った.
    mapにキー値がある場合、この関数は私が設定した値をvalueに返します.
    マッピングにkeyに対応する値がない場合はdefaultに設定された値を返します.
    だから地図は繰り返してはいけない性質を持っている.
    名前をキーとして、名前に対応する選手が何人いるかの数字にvalueを加えればいい.
    import java.util.*;
    
    class Solution {
        public String solution(String[] participant, String[] completion) {
            String answer = "";
    		// key = String , value는 Integer 형의 map 선언
            Map<String,Integer> map = new HashMap<>();
            
            //향상된 for문을 사용해 map에 정보를 넣는데,
            //이때 value값에 map.getOrDefault()를 사용해 
            //해당 이름의 key값이 이미 map에 있다면 +1을해서 넣어주고 
            //아니라면 1로 입력되게 한다(0이 default인데 +1을 해주므로써 1명이 있게 되는거			//다)
            for(String player : participant){
                map.put(player,map.getOrDefault(player,0) + 1);
            }
            
            //map에서 완주된 선수들의 명단을 -1해서 다시 설정해준다.
            for(String player : completion){
                map.put(player,map.get(player)-1);
            }
            
            //map에서 value의 값이 0이 아니라면 -> 완주를 했다면 위의 for문에서 -1을 했기		 //때문에 0 일 수 밖에 없다.
            for(String player : participant){
                if(map.get(player) != 0){
                    answer = player;
                    break;
                }
            }
    
            return answer;
        }
    }