スポーツウェア


#2020. 09. 18

問題の説明


昼食の時間に盗まれ、一部の学生の運動服が盗まれた.幸いなことに、余分な運動服を貸したい学生がいます.学生の番号は体格順で、前の番号の学生か後ろの番号の学生の運動服しか貸せません.例えば、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

    に答える

    import java.util.Arrays;
    
    class Solution {
        public int solution(int n, int[] lost, int[] reserve) {
            int answer = n;
            int arr[] = new int[n];
            Arrays.sort(lost);
            Arrays.sort(reserve);
            for(int i = 0; i < n; i++) {
                arr[i] = 1;
            }
            for(int i = 0; i < lost.length; i++) {
                for(int j = 0; j < n; j++) {
                    if(j == lost[i] - 1) {
                        arr[j]--;
                        break;
                    }
                }
            }
            for(int i = 0; i < reserve.length; i++) {
                for(int j = 0; j < n; j++) {
                    if(j == reserve[i] - 1) {
                        arr[j]++;
                        break;
                    }
                }
            }
            for(int i = 0; i < n; i++) {
                if(arr[i] == 0) {
                    if(i - 1 >= 0 && arr[i - 1] == 2) {
                        arr[i] += 1;
                        arr[i - 1] -= 1;
                    }
                    else if(i + 1 < n && arr[i + 1] == 2) {
                        arr[i] += 1;
                        arr[i + 1] -= 1;
                    }
                    else answer--;
                }
            }
            return answer;
        }
    }
    最初は配列の2つのインデックス条件を比較したが,実装過程で方法を変えた.
    頭が痛くてたまらない...
    しかも、女性用のユニホームを持ってきた生徒が盗まれるとは思いもよらなかった.(なんでできなかったんだろう)
    失われた配列とreserve配列を並べ替えた後、完全な配列を作成し、すべてを1に初期化します.
    配列全体において、loss配列のインデックスは-1、reserve配列のインデックスは+1であり、lossとreserveの合計を完了する.
    最後に、配列の値が0のインデックスに基づいて、前後の2つのモーションウェアのあるインデックスを検索し、合計数を調整します.