変装する


1.変装術!


これは問題です.服の種類と服があれば、どのくらいの場合の数を見つけることができますか.例えば、以下の服が与えられたとします.
let clothes = [
  ["yellowhat", "headgear"],
  ["blackhat", "headgear"],
  ["yellowsunglasses", "eyewear"],
  ["green_turban", "headgear"],
  ["yellowsunglasses", "eyewear"],
  ["sandle", "shoes"],
  ["sandle", "shoes"],
  ["orange_turban", "headgear"],
  ["sandle", "shoes"],
  ["bluesunglasses", "eyewear"],
  ["sandle", "shoes"],
  ["sandle", "shoes"],
];
ここで帽子やメガネ、靴を交換しても変装に成功します.だから、黄色いhat+green turban+sandleを着て、翌日青いサングラスに着替えると、変装に成功します.

2.方法


これはまずhashを作成し、各服をキーとし、対応する服の数をvalueとする必要があります.次に、服の種類の数に(신발/모자 or 신발/안경 ...)キーを乗じた値を求める.つまり、まず服装の種類に局所集合をして、その集合の値を乗じてからやります!前回局所集合を行い,それを適用して解いた.
  • pesudo code
  • アパレル製造Hash
  • クローゼットHashでクローゼットアレイ
  • を作成する.
    作成
  • checkarr
  • サブセット関数を作成し、checkArrを使用して部分集合
  • を作成します.
  • の部分集合における衣類の種類数に乗じた値を加算する.
  • でも何も着ない場合もありますが、それを排除するためにcalculate boolean
  • を使用しました
    function mySolution(clothese) {
      // setting
      let clothesHash = [];
      let closet = [];
      let subSum = 1;
      let finalSum = 0;
      let calculate = false;
    
      let temp = [];
      let answer = [];
    
      for (let i = 0; i < clothes.length; i++) {
        clothesHash[clothes[i][1]]
          ? (clothesHash[clothes[i][1]] = ++clothesHash[clothes[i][1]])
          : (clothesHash[clothes[i][1]] = 1);
      }
    
      for (let i in clothesHash) {
        closet.push([i, clothesHash[i]]);
      }
      let checkArr = Array.from({ length: closet.length }, () => 0);
    
      // subset
      function subset(type) {
        if (type > closet.length - 1) {
          // checkArr에 따라서 옷종류를 고르고 있음
          for (let i = 0; i < checkArr.length; i++) {
            if (checkArr[i] === 1) {
              subSum *= closet[i][1];
              calculate = true;
            }
          }
          // 고른 옷에 해당되는 옷의 갯수를 곱해서 경우의 수를 구하고 누적
          if (calculate) {
            finalSum += subSum;
            subSum = 1;
            calculate = false;
          } else {
            subSub = 0;
          }
        } else {
          checkArr[type] = 1;
          subset(type + 1);
          checkArr[type] = 0;
          subset(type + 1);
        }
      }
    
      subset(0);
    
      return finalSum;
    }
    checkAr,対応する衣服の種類の個数,finalSum,subSum,closter,closeHash出力は以下の通りである.
    // closet
    ["headgear", 4]
    ["eyewear", 3]
    ["shoes", 5]
    
    // clothesHash
    eyewear: 3
    headgear: 4
    shoes: 5
    
    //checkArr, 그에 해당되는 옷의 종류의 갯수, finalSum, subSum
     checkArr: (3) [1, 1, 1] (headgear, eyewear, shoes를 모두 선택하는 경우)
     그에 해당되는 옷의 종류의 갯수: (3) [4, 3, 5]
     finalSum: 60 / subSum: 60
     (3) [1, 1, 0]
     (2) [4, 3]
     72 12
     (3) [1, 0, 1]
     (2) [4, 5]
     92 20
     (3) [1, 0, 0]
     [4]
     96 4
     (3) [0, 1, 1]
     (2) [3, 5]
     111 15
     (3) [0, 1, 0]
     [3]
     114 3
     (3) [0, 0, 1]
     [5]
     119 5
    
     // 아무것도 안입은 경우
     (3) [0, 0, 0]
     []
    ちょっと複雑でしたが、できました!!ましてや、私が学んだことを使って、答えを出しました.これは本当に勉強と成長です.助けてくれた人たちに本当に感謝します.
    でももっときれいにできる方法もあります.
    function otherSolution(clothes) {
      let answer = 1;
      let obj = {};
      for (let i = 0; i < clothes.length; i++) {
        obj[clothese[i][1]] = (obj[clothese[i][1]] || 1) + 1;
      }
    
      for (let key in obj) {
        answer *= obj[key];
      }
    
      return answer - 1;
    }
    驚くほどきれいになり、薬水の個数を求める公式のようになりました.
    約数
    上記の内容をよく参考にしてほしい.一言、h^4 e^3 s^5に乗じた場合の数字でいいです.headgear眼鏡の靴は何ですか?彼らが何人いるかを見つけて、平均ペアの数を求めます.
    答え-1では-1は1としかペアにならない、つまりここでは何も着ていない.
    薬水を求める個数を思いついたなんて...入力と経験値が大きいと,このような考えを行う確率が高くなるようだ.
    あるいはすべての場合の数字は表で可視化され、そこでルールが見つかります!それは複雑ではありません.単純になりました.
    肝心なのは簡単にすることです!
    先に解いて整理してから応用しましょう.