メニューjavascriptの更新

12393 ワード

function combination(arr, n) {
    const result = [];
    if (n === 1) return arr.map(e => [e]);
    
    arr.forEach((e,i,arr) => {
        const copy = arr.slice(i+1);
        const cases = combination(copy, n-1);
        const combi = cases.map(v => [e, ...v]);
        result.push(...combi);
    })
    
    return result;
}

function solution(orders, course) {
    const answer = [];
    
    course.forEach(num => {
        const map = new Map();
        
        orders.forEach(menu => {
            const menuArr = menu.split('').sort();
            const combinations = combination(menuArr, num);
            
            combinations.forEach(e => {
                const key = e.join('');
                map.set(key, map.get(key) + 1 || 1);
            })
        })
        
        const setMenu = [...map].sort((a,b) => b[1] - a[1]);
        
        for (let i = 0; i < setMenu.length; i++) {
            const max = setMenu[0][1];
            
            if (max === 1) break;
            if (setMenu[i][1] < max) break;
            
            answer.push(setMenu[i][0]);
        }
    })
    
    return answer.sort();
}
解説
コアは,組合せ再帰関数によって組合せを実現することを理解することである.
各Orders要素から任意の数の単品メニューを抽出し、組み合わせを実現します.
ex)単品メニュー:["ABCFG"],個数:2個->組み合わせ(単品メニュー,個数)-["A","B",["A","C",["A","F"…["F","G"];
エクスポートされた各組合せはキーとしてmapに格納され、同じ組合せの個数はvalueとしてmapに格納される.
combinations.forEach(e => {
                const key = e.join('');
                map.set(key, map.get(key) + 1 || 1);
            })
/* map: 	[
  [ 'AB', 1 ], [ 'AC', 4 ],
  [ 'AF', 1 ], [ 'AG', 1 ],
  [ 'BC', 2 ], [ 'BF', 2 ],
  [ 'BG', 2 ], [ 'CF', 2 ],
  [ 'CG', 2 ], [ 'FG', 2 ],
  [ 'CD', 3 ], [ 'CE', 3 ],
  [ 'DE', 3 ], [ 'AD', 2 ],
  [ 'AE', 2 ], [ 'AH', 1 ],
  [ 'CH', 1 ], [ 'DH', 1 ],
  [ 'EH', 1 ]
] */ 
mapを配列に設定し、[1]インデックス降順で並べ替え、最大値のキーのみを正解とします.