[プログラマーlv.2]JSに偽装


✉ Question


🔗 質問リンク

問題の説明


スパイたちは毎日違う服を着て自分を偽装している.
例えば、スパイの服が以下のように、今日スパイが丸い眼鏡、長いコート、青いTシャツを着ている場合は、翌日はジーンズを追加したり、黒いサングラスをかけたりして、丸い眼鏡ではありません.
タイプ|名前
サングラス
上着
ジーンズ
コート着
スパイが持っている服に二次元配列の服が与えられた場合、異なる服の組み合わせの数を返すために解関数を作成します.

せいげんじょうけん

  • 服装の各行は「服装名、服装種類」からなる.
  • スパイが持っている服の数は1着以上30着以下.
  • のような名前の服は存在しません.
  • アパレルのすべての要素は文字列から構成されています.
  • すべての文字列の長さは、1または20未満の自然数であり、アルファベット小文字または「」のみから構成されます.
  • スパイは毎日少なくとも1枚の服を着ている.
  • 💌 Answer


    ハッシュ問題
    1️⃣   ハッシュマッピングとしてobjectを使用する
    1.kinds配列で指定された衣類の種類を全て入れた後、objをキーとし、可能な場合は数量を値とする(当該衣類を全く選択しない場合を考慮すると初期値は2).
    2.objからケース数にcombinationを乗じると、可能なすべての組合せ数が得られる.
    3.问题のうち少なくとも1枚は着なければならないが、1枚も着ていない场合を除き、answerに返事する.
    function solution(clothes) {
        let answer = 0;
        let combination = 1;
        let kinds = [];
        
        for(let i = 0; i < clothes.length; i++) {
            kinds.push(clothes[i][1]);
        }
    
        let obj = kinds.reduce((cnt, element) => {
            if(cnt[element]) {
                cnt[element] += 1;
            }else {
                cnt[element] = 2;
            }
            return cnt;
        }, {});
        
        for(let key in obj) {
            combination *= obj[key];
        }
        
        answer = combination - 1;
        
        return answer;
    }

    2️⃣   Mapを使用したハッシュの作成mapにおいて、種類をキーとし、場合の数を値とし、これらの値を取り出して組合せを乗じ、すべての組合せの数を求める.何も着ない場合を除き、answerに戻ります.
    function solution(clothes) {
        let answer = 0;
        let combination = 1;
        let map = new Map();
        
        for(let i = 0; i < clothes.length; i++) {
            if(!map.get(clothes[i][1])) map.set(clothes[i][1], 2);
            else map.set(clothes[i][1], map.get(clothes[i][1]) + 1);
        }
        
        for(let v of map.values()) {
            combination *= v;
        }
        
        answer = combination - 1;
        
        return answer;
    }

    .
    .
    .
    解法は同じですが、mapはvalueを直接ポップアップできるので、コードはもっと簡単になったようです!
    この組み合わせ問題は問題を解く前に制限条件をよく見て、方向を把握することが重要で、多くの時間を費やしました.💨
    他の解題方法を考えてみるのもいいですね.🙄