06.08에 푼 문제입니다🌷
메뉴리뉴얼
순열을 이용한 문제이다.
function solution(orders, course) {
var answer = [];
let menulist=[]
let maplist=new Map()
//순열로 가능한 메뉴를 뽑아본다.
orders.map(order=>{
order=[...order].sort()
course.map(c=> menulist.push(...getCombination(order,c)))
})
//세트메뉴가 몇명의 손님이 주문했는지 계산한다.
menulist.map(menu=>{
menu=menu.join('')
if(!maplist.get(menu))
maplist.set(menu,0)
maplist.set(menu,maplist.get(menu)+1)
})
// 한명 이상이 주문한 메뉴를 고른다.
for(let [key,value] of maplist){
if(value<2) maplist.delete(key)
}
menulist=[...maplist]
//c개의 코스 메뉴중 가장 많이 주문한 코스를 선택한다.
course.map(c=>{
const menus=menulist.filter(menu=>c===menu[0].length)
menus.sort((a,b)=>b[1]-a[1])
const max=menus[0]
const setmenus=menus.filter(m=>m[1]===max[1])
setmenus.map(menu=>answer.push(menu[0]))
})
answer.sort()
return answer;
}
function getCombination(orders,num){
const results=[]
if(num===1) return orders.map(order=>[order])
orders.forEach((fixed,index,origin)=>{
const rest=origin.slice(index+1)
const combination=getCombination(rest,num-1)
const attach = combination.map(com=>[fixed,...com])
results.push(...attach)
})
return results
}