メニュー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]インデックス降順で並べ替え、最大値のキーのみを正解とします.Reference
この問題について(メニューjavascriptの更新), 我々は、より多くの情報をここで見つけました https://velog.io/@gytlr01/메뉴-리뉴얼-javascriptテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol