プログラマー(レベル1)-ポケモン


ポケモン


質問する


長い旅行を経て、あなたはやっと洪博士の研究室に着いた.洪博士はあなたに教えて、あなたは自分の実験室の全部のN匹の携帯電話の殻の中からN/2匹を持っていくことができます.
ホン博士研究室のボンケンモンは種類番号で区別されている.そのため、同じタイプの携帯電話のガードプロセスには同じ番号があります.例えば、研究室に4つの携帯電話のケースがある場合、各携帯電話のケースの種類番号は[3号、1号、2号、3号]で、3号携帯電話のケースが2つ、1号携帯電話のケースが2つ、2号携帯電話のケースが2つあることを示しています.このとき、4つのケースの中から2つを選ぶ方法は、以下の6つがあります.
1回目(3回目)、2回目(1回目)携帯電話のデーモンを選択
1回目(3回目)、3回目(2回目)の携帯電話のデーモンを選択
1回目(3回目)、4回目(3回目)携帯電話のデーモンを選択
2つ目(1つ)、3つ目(2つ)の携帯電話のデーモンを選択
2つ目(1つ)、4つ目(3つ)の携帯電話のデーモンを選択
3つ目(2つ目)、4つ目(3つ目)の携帯電話のデーモンを選択
この場合、1番目(3番)のphonecketmonと4番目(3番)のphonecketmonを選択する方法は1つ(3番のphonecketmonの2つ)のphonecketmonしかありませんが、他の方法は2つのphonecketmonがあります.したがって、上記の例では、携帯電話のケースタイプ数の最大値は2です.
可能な限り多くの携帯電話の保護プロセスを望んでいるので、できるだけ多くの携帯電話の保護プロセスを含むN/2を選択したいと思っています.n個の携帯電話ガードプロセスタイプ番号を含む配列numsをパラメータとして指定すると、N/2個の携帯電話ガードプロセスを選択する方法のうち、最も多くのタイプの携帯電話ガードプロセスを選択する方法を見つけ、解法関数を完了し、当時の携帯電話ガードプロセスタイプ番号の個数を返す.

せいげんじょうけん

  • numsは、携帯電話のデーモンプロセスのタイプ番号を含む1次元配列です.
  • numsの長さ(N)は1または10000以下の自然数であり、常に偶数である.
  • 携帯電話のガードプロセスのタイプ番号は1または2万0以下の自然数です.
  • 最も多くのタイプの携帯電話のデーモンを選択する方法が複数ある場合は、最大1つの選択可能な携帯電話のデーモンタイプの値を返すだけでよい.
  • I/O例



    作成されたコード

    function solution(nums) {
        var answer = 0;
    
        let selected = [];
        nums.map(n=>!selected.includes(n)&&selected.push(n));
    
        if(selected.length>nums.length/2){
            answer = nums.length/2
        }else{
            answer = selected.length
        }
    
        return answer;
    }
    
    質問をした後、他の人の回答を見てみると、Setを使った回答が上位にランクインしています.

    Set


    Setオブジェクトは、データ型を考慮することなく、元の値とオブジェクト参照の一意の値を格納できます.Setオブジェクトは値の集合であり,要素を挿入順にループすることができる.1つのセット内の値は1回しか表示されません.すなわち,ある値はSet集合において一意である.new Set([iterable])パラメータ[内部]
    重複可能なオブジェクトが渡されると、すべての要素が新しいセットに追加されます.パラメータが指定されていないかnullが渡されていない場合は、新しい設定は空です.
    戻り値
    新しいSetオブジェクト

    設定方法

  • add(値)-要素
  • を追加
  • delete(値)-要素
  • を削除
  • clear(value)-オブジェクト内のすべての要素
  • を削除します.
  • has(value)-ブール戻り(要素なし)
  • size-要素数
  • forEach(callbackFn[,thisArg])-Setオブジェクトの値ごとに挿入順にcallbackFnを呼び出します.forEachでthisArgパラメータが指定されている場合、コールバックごとにこの値になります.
  • setオブジェクトの使用

    var mySet = new Set();
    
    mySet.add(1); // Set { 1 }
    mySet.add(5); // Set { 1, 5 }
    mySet.add(5); // Set { 1, 5 }
    mySet.add('some text'); // Set { 1, 5, 'some text' }
    var o = {a: 1, b: 2};
    mySet.add(o);
    
    mySet.add({a: 1, b: 2}); // o와 다른 객체를 참조하므로 괜찮음
    
    mySet.has(1); // true
    mySet.has(3); // false, 3은 set에 추가되지 않았음
    mySet.has(5);              // true
    mySet.has(Math.sqrt(25));  // true
    mySet.has('Some Text'.toLowerCase()); // true
    mySet.has(o); // true
    
    mySet.size; // 5
    
    mySet.delete(5); // set에서 5를 제거함
    mySet.has(5);    // false, 5가 제거되었음
    
    mySet.size; // 4, 방금 값을 하나 제거했음
    console.log(mySet);
    // Set {1, "some text", Object {a: 1, b: 2}, Object {a: 1, b: 2}}

    Arrayオブジェクトとの関係

    var myArray = ['value1', 'value2', 'value3'];
    
    // Array를 Set으로 변환하기 위해서는 정규 Set 생성자 사용
    var mySet = new Set(myArray);
    
    mySet.has('value1'); // true 반환
    
    // set을 Array로 변환하기 위해 전개 연산자 사용함.
    console.log([...mySet]); // myArray와 정확히 같은 배열을 보여줌

    Setを使って問題を解く

    function solution(nums) {
        var answer = 0;
        
        let selected = [...new Set(nums)]
        let max = nums.length/2
        
        answer = selected.length > max ? max : selected.length
        
        return answer;
    }
    詳細については、「設定」(MDM)を参照してください。