プログラマー-スポーツウェア


1.質問
質問リンク
説明:
昼食の時間に盗まれ、一部の学生の運動服が盗まれた.幸いなことに、余分な運動服を貸したい学生がいます.学生の番号は体格順で、前の番号の学生か後ろの番号の学生の運動服しか貸せません.例えば、4番の学生は3番か5番の学生にしか運動服を貸すことができません.運動服がないと授業を受けられないので、適当に運動服を借りて、できるだけ多くの学生に体育の授業をさせなければなりません.
すべての学生の数n,ジャージを盗まれた学生の番号の並びloss,複数のジャージを持った学生の番号の並びreserveをパラメータとした場合,解関数を書いて体育の授業を受けられる学生の最上位値を返してください.
せいげんじょうけん
  • 全体の生徒数は2名以上30名以下であった.
  • 運動服を盗まれた生徒数は1名以上n名以下で重複番号はない.
  • 着以上のユニフォームの学生数は1名以上n名以下で、重複番号はありません.
  • 着以上の運動服を持っている学生だけが他の学生に運動服を貸すことができます.
  • 着以上の運動服を持っている学生は盗まれたかもしれません.このとき、この学生は1枚の運動服だけが盗まれたと仮定し、1枚の運動服しか残っていないため、他の学生に運動服を貸すことができない.
  • 2.解答
    2-1. 条件
  • の前方番号の学生や後方番号の学生だけが運動服を借りることができます.
  • 着以上の運動服を持ってきた学生が盗まれた可能性があります.
  • 2-2. に答える
    私の説明の仕方はこうです.
    初めて運動服をなくした学生の数を数えなさい.
    婦人服を持った学生たちが貸してくれた部分.
    紛失した学生の数を減らす方法.
    どういう意味か分からないだけで、ゆっくり実現しましょう.
    計画1-すべての学生を初期化します.
    const wear = [...Array(n + 2)].map(() => 1);
    私が選択したデータ構造は、現実の複雑な問題をコンピュータでデータ化するための1次元配列です.
    基本的に学生一人一人がユニホームを持っているので、1に初期化されました.
    また,前後の学生に貸与する部分を実施すると,インデックスがずれてしまう.
    長さはn + 2に初期化された.
    計画2-複数の服を着た学生と服をなくした学生を初期化する.
    let lost_cnt = 0; // 옷을 잃어버린 학생 수
    
    reserve.forEach(v => wear[v]++); // 여별의 옷을 가져온 학생들
    lost.forEach(v => {
        wear[v]--;
        if (!wear[v]) lost_cnt++; // 옷이 없다면 잃어버린 학생 수 변수 증가
    });
    このように実施すれば、2-1でまとめた2番条件は気にならない.
    全部で何人が服を持っていないのか、どの学生が服を借りることができますか.
    プラン3-レンタル
     reserve.forEach(v => {
       	// 옷을 빌려줄 수 있을 때 (2벌 이상 있을 때)
            if (wear[v] >= 2) {
                if (!wear[v - 1]) { // 앞자리 학생이 옷이 없을 때
                    wear[v - 1]++;
                    wear[v]--;
                    lost_cnt--;
                }
                else if (!wear[v + 1]) { // 뒷자리 학생이 옷이 없을 때
                    wear[v + 1]++;
                    wear[v]--;
                    lost_cnt--;
                }
    	}
    });
    
    このような方法で服を貸してくれれば、貸してください.
    貸出のたびに失われる学生変数を減らします.
    計画4-全生徒数から服をなくした生徒数を回復する.
    服のある学生の数を返すという意味ですが、同じ意味でしょうか.
    3.完全なコード
    function solution(n, lost, reserve) {
        // 계획1 - 전체 학생을 초기화합니다.
        const wear = [...Array(n + 2)].map(() => 1);
        
        // 계획2 - 여벌의 옷이 있는 학생들과 옷을 잃어버린 학생들이 몇 명인지 초기화합니다.
        let lost_cnt = 0; // 옷을 잃어버린 학생 수
    
        reserve.forEach(v => wear[v]++); // 여별의 옷을 가져온 학생들
        lost.forEach(v => {
            wear[v]--;
            if (!wear[v]) lost_cnt++; // 옷이 없다면 잃어버린 학생 수 변수 증가
        });
    
        // 계획3 - 옷을 빌려줍니다.
        reserve.forEach(v => {
            // 옷을 빌려줄 수 있을 때 (2벌 이상 있을 때)
            if (wear[v] >= 2) {
                if (!wear[v - 1]) { // 앞자리 학생이 옷이 없을 때
                    wear[v - 1]++;
                    wear[v]--;
                    lost_cnt--;
                }
                else if (!wear[v + 1]) { // 뒷자리 학생이 옷이 없을 때
                    wear[v + 1]++;
                    wear[v]--;
                    lost_cnt--;
                }
            }
        });
    
        // 계획4 - 전체 학생수에서 옷을 잃어버린 학생 수를 리턴합니다.
        return n - lost_cnt;
    }