function makeCombinations(arr, selectNumber) {
const results = [];
if (selectNumber === 1) return arr.map((el) => [el]);
arr.forEach((fixed, index, origin) => {
const rest = origin.slice(index + 1);
const combinations = makeCombinations(rest, selectNumber - 1);
const attached = combinations.map((el) => [fixed, ...el]);
results.push(...attached);
});
return results;
}
function getCombinations(orders, c){
let ret = [];
let menues;
let combinations;
orders.forEach((order)=>{
menues = order.split("");
combinations = makeCombinations(menues, c);
combinations.forEach((combination)=>{
combination.sort();
if(!ret.includes(combination.join(""))){
ret.push(combination.join(""))
}
})
})
return ret.map((item)=>item.split(""));
}
function solution(orders, course) {
let answer = [];
let combinations;
let currentCnt;
let maxCnt;
let maxCombinations;
course.forEach((c)=>{
combinations = getCombinations(orders, c);
maxCnt = 0;
maxCombinations = [];
combinations.forEach((combination)=>{
currentCnt = 0;
orders.forEach((order)=>{
if(combination.every((menue)=>order.includes(menue))){
currentCnt++;
}
})
if(currentCnt>=2){
if(maxCnt === currentCnt){
maxCombinations.push(combination.join(""));
}
if(maxCnt < currentCnt){
maxCnt = currentCnt;
maxCombinations = [combination.join("")];
}
}
})
if(maxCombinations.length){
answer.push(...maxCombinations);
}
})
answer.sort();
return answer;
}