スポーツウェア


問題の説明
昼食の時間に盗まれ、一部の学生の運動服が盗まれた.幸いなことに、余分な運動服を貸したい学生がいます.学生の番号は体格順で、前の番号の学生か後ろの番号の学生の運動服しか貸せません.例えば、4番の学生は3番か5番の学生にしか運動服を貸すことができません.運動服がないと授業を受けられないので、適当に運動服を借りて、できるだけ多くの学生に体育の授業をさせなければなりません.
すべての学生の数n,ジャージを盗まれた学生の番号の並びloss,複数のジャージを持った学生の番号の並びreserveをパラメータとした場合,解関数を書いて体育の授業を受けられる学生の最上位値を返してください.
せいげんじょうけん
  • 全体の生徒数は2名以上30名以下であった.
  • 運動服を盗まれた生徒数は1名以上n名以下で重複番号はない.
  • 着以上のユニフォームの学生数は1名以上n名以下で、重複番号はありません.
  • 着以上の運動服を持っている学生だけが他の学生に運動服を貸すことができます.
  • 着以上の運動服を持っている学生は盗まれたかもしれません.このとき、この学生は1枚の運動服だけが盗まれたと仮定し、1枚の運動服しか残っていないため、他の学生に運動服を貸すことができない.
  • I/O例
    nlostreservereturn5[2,4][1,3,5]55[2,4][3]43[3][1]2
    I/O例説明
    例1
    1番学生は運動服を2番学生に貸し、3番学生または5番学生は運動服を4番学生に貸し、5人は体育の授業を受けることができる.
    例2
    3番の学生は運動服を2番の学生か4番の学生に貸して、4人の学生は体育の授業を受けることができます.
    コード#コード#
    import java.util.*;
    
    class Solution {
        public int solution(int n, int[] lost, int[] reserve) {
            
            // 전체학생수-잃어버린학생수 
            int answer = n - lost.length;
            
            Arrays.sort(lost);
            Arrays.sort(reserve);
            
            // 여벌갖고온 학생이 잃어버린경우
            for (int i=0; i< lost.length; i++) {
                for(int j=0; j<reserve.length; j++){
                    if(lost[i] == reserve[j]){
                        answer++; // 어차피 한벌 더 갖고와서 수업에 참여할 수 있음
                        lost[i] = -9999; // 잃어버린 명단에서 제외
                        reserve[j] = -9999; // 여벌갖고온 명단에서 제외
                        break;
                    }
                }
            }
            
            // 빌려줄때
            for (int i=0; i<lost.length; i++){
                for(int j=0; j<reserve.length; j++){
                    // 여벌갖고온 학생이 잃어버린 학생의 앞번호, 뒷번호일때
                if((lost[i]-1 == reserve[j]) || (lost[i]+1 == reserve[j])){
                        answer++; // 빌려줬으니까 참여가능
                        reserve[j] = -9999; // 빌려주고 제외
                        break;
                    }
                }
            }
            return answer;
        }
    }
    グリディを用いて説明する.