[プログラマー]メニュー更新-javascript


📌 質問する


https://programmers.co.kr/learn/courses/30/lessons/72411?language=javascript

📌 に答える

function solution(orders, course) {
  let menu = new Map();
  const makeMenu = (menuMap, targetMenu, menuNum, idx, curMenu) => {
    if (curMenu.length === menuNum) {
      let menuStr = curMenu.sort().join('');

      menu.set(menuStr, (menu.get(menuStr) || 0) + 1);
    }
    for (let i = idx; i < targetMenu.length; i++) {
      makeMenu(menuMap, targetMenu, menuNum, i + 1, [...curMenu, targetMenu[i]]);
    }
  };

  orders.map((order) => {
    course.map((courseNum) => makeMenu(menu, order, courseNum, 0, []));
  });
  menu = [...menu.entries()].filter((menuItem) => menuItem[1] > 1);

  let ans = [];

  course.map((courseNum) => {
    let filteredMenu = menu.filter((menuItem) => menuItem[0].length === courseNum).sort((a, b) => b[1] - a[1]);
    let maxCnt = filteredMenu.length ? filteredMenu[0][1] : 0;
    filteredMenu.filter((menuItem) => menuItem[1] === maxCnt).map((menu) => ans.push(menu[0]));
  });

  return ans.sort();
}
✔アルゴリズム:実施
✔メニューを組み合わせて確定し、メニューを含む人数を計算して問題を解く
✔メニュー組合せ関数
const makeMenu = (menuMap, targetMenu, menuNum, idx, curMenu) => {
    if (curMenu.length === menuNum) {
      let menuStr = curMenu.sort().join('');

      menu.set(menuStr, (menu.get(menuStr) || 0) + 1);
    }
    for (let i = idx; i < targetMenu.length; i++) {
      makeMenu(menuMap, targetMenu, menuNum, i + 1, [...curMenu, targetMenu[i]]);
    }
  };
✔入力条件により、すべての場合、ナビゲーションがタイムアウトしません.
orders.map((order) => {
    course.map((courseNum) => makeMenu(menu, order, courseNum, 0, []));
  });
✔メニューセットは、少なくとも2名以上のお客様が注文した単品メニューセットのみ可能なので、Mapを並べてフィルタリングします.
menu = [...menu.entries()].filter((menuItem) => menuItem[1] > 1);
✔coursenumを遍歴し、coursenumが組み合わせ長さの場合のみ、1回の濾過を行い、回数を降順に並べ替え、最大値の2回の濾過であるか確認することでansを入れる
course.map((courseNum) => {
    let filteredMenu = menu.filter((menuItem) => menuItem[0].length === courseNum).sort((a, b) => b[1] - a[1]);
    let maxCnt = filteredMenu.length ? filteredMenu[0][1] : 0;
    filteredMenu.filter((menuItem) => menuItem[1] === maxCnt).map((menu) => ans.push(menu[0]));
  });
✔難易度:プログラマー標準LEVEL 2