[プログラマー]LV3デジタルゲーム(JS)


質問する
xx社の2 xN名の従業員は2つのグループに分けられ、各グループはN名である.二つのチームはAチームとBチームです.デジタルゲームのルールは以下の通りです.
  • まず、すべての寺院にランダムに自然数が与えられた.
  • 従業員は1人につき1回しか試合をしません.
  • 試合ごとにAチームに1人の選手がいて、Bチームに1人の選手がいて、お互いに人数を公開します.そのとき数字の大きい方が勝ち、勝利した社員が所属するチームが1点を獲得する.
  • 数字が同じであれば、誰もポイントを得ることはできません.
  • 従業員全員がまずランダムに自然数を割り当てられた.そしてAチームはすぐに出場順を決め、自分の出場順をBチームに公開した.Bチームはそれを見て、自分の最終ポイントが一番高い方法で選手たちの出場順を決めた.この時Bチームが獲得したポイントを見つけてください.
    Aチームメンバーに付与されたスコアが出場順に並べられたAとIグループ要素がBチームのiグループメンバーに付与されたスコアのBグループである場合は、解関数を完了し、Bチームメンバーが得られる最大ポイントを返すようにしてください.
    制限
  • AとBの長さは同じです.
  • AおよびBの長さは1または10万以下である.
  • AとBの各元素の自然数は1または10万以上である.
  • I/O例
    ABresult[5,1,3,7][2,2,6,8]3[2,2,2,2][1,1,1,1]0
    に答える
    これはよく近づくことができる問題です.問題の指紋を見ると、A組の順番が漏れていた.そのため、Bチームが相応の順番を見て、確実に勝つことができれば、自分の選手を選ぶことができます.
    Aチームの順番が決まっているので、これを利用してアプローチすることもできますが、もう少し簡単に考えてみてください.実はこの順番はそんなに重要ではありません!順序に関係なく、ゲームのルールはより自然な数の人が1点を獲得する構造であり、Aチームの順序が公開されているからだ.つまり、BチームはAチームの順番を知っているので、状況に応じて自分の選手を配置することができる.つまり、問題の核心は、BグループがAグループにどのような数字があるかを把握していることだ.
    Aチームが持っている数字のリストをすでに把握していれば、出場順は重要ではない.この数字を持っている人に勝てば、出力できるからです.このとき最大のポイントを得るためには、Bチームの最大の数字から、Aチームの最小の数字から順に、当たっていきます.そこで,2つの配列をそれぞれ昇順と降順に並べ替え,次いで開始と終了を順に比較し,B群の要素がより大きい場合を調べるように解いた.
    この場合,効率的に,Max値をB配列の最後のインデックスに保持し続けることで繰返しを減らすことができる.つまり、一度に使用する番号は繰り返し使用できないので、B配列の最後の最大の数字は一度使用した後に削除することができます.これにより、配列の最後のインデックスが現在最大の要素となり、A配列の開始要素とB配列の最後の要素を順次比較することができる.
    ...
    const max = B[B.length - 1];
    if(a < max) {	// max가 더 큰 경우에만
      answer++;	// 승점을 1올리고
      B.pop();	// 마지막 원소는 제거
    }
    ...
    2つの並べ方を比較する方法が身についていれば、大きな難題ではありません.以下に、コメント以外のすべてのコードを示します.
    コード#コード#
    function solution (A, B) {
      let answer = 0;
      
      A.sort((a,b) => b-a);
      B.sort((a,b) => a-b);
      
      for(const a of A) {
        const max = B[B.length - 1];
        if(a < max) {
          answer++;
          B.pop();
        }
      }
      
      return answer;
    }
    ソース
    https://programmers.co.kr/learn/courses/30/lessons/12987