메뉴 리뉴얼
문제풀이
- 손님이 주문한 메뉴들에 대해서 course를 기준으로 순열을 돌린다.
- obj에 해당 메뉴들이 몇번 주문됐는지 계산한다.
- obj에서 최댓값을 뽑아서 메뉴를 구성한다.
function permutation(arr, pick, str){
if(str.length === pick) return [];
return arr.reduce((acc,val,i) => {
let newArr = arr.slice(i+1);
let result = permutation(newArr, pick, str+val);
let w = str+val;
if(w.length === pick){
acc.push(w);
}
acc.push(...result);
return acc;
},[]);
}
function solution(orders, course) {
const answer = [];
const obj = {};
for(const c of course){ // 코스요리로 만들 음식 갯수를 가지는 배열
orders.map(order => {
const r = permutation([...order].sort(), c, "");
r.map(e => {
obj[e] ? obj[e]++ : obj[e] = 1; // 음식들의 조합이 몇번 나왔는지 누적
})
});
}
const result = Object.entries(obj).filter(([k,v]) => v >= 2); // 2 이상이여야 하므로 2이상만 필터링
for(const c of course){ // 각 코스요리를 뽑아야 함
const temp = result.filter(e => e[0].length === c).sort((a,b) => b[1]-a[1]);
for(let i=0 ; i<temp.length ; i++){
if(temp[i+1] && temp[i][1] !== temp[i+1][1]){ // 최댓값이 하나인경우
answer.push(...temp.slice(0, i+1).map(e => e[0]));
break;
}
if(i === temp.length-1){ // 최댓값이 여러 개인 경우
answer.push(...temp.map(e => e[0]));
}
}
}
return answer.sort();
}