이모티콘 할인행사

Lv. 2

Solution

export function saleEmoticons(users: [number, number][], emoticons: number[]): [number, number] {
  const getAllDiscounts = (): number[][] => {
    const allDiscounts: number[][] = [];
 
    const dfs = (discounts: number[] = []) => {
      if (discounts.length === emoticons.length) {
        allDiscounts.push([...discounts]);
        return;
      }
      for (const discount of [10, 20, 30, 40]) {
        discounts.push(discount);
        dfs(discounts);
        discounts.pop();
      }
    };
    dfs();
 
    return allDiscounts;
  };
 
  const getDiscountedPrice = (price: number, discount: number): number => {
    return (price * (100 - discount)) / 100;
  };
 
  const getResult = (user: [number, number], discounts: number[]): [number, number] => {
    const [minDiscount, maxPrice] = user;
 
    const totalPrice = discounts.reduce(
      (prev, discount, i) =>
        discount < minDiscount ? prev : prev + getDiscountedPrice(emoticons[i], discount),
      0,
    );
 
    return maxPrice <= totalPrice ? [1, 0] : [0, totalPrice];
  };
 
  const allDiscounts = getAllDiscounts();
 
  let [maxSubscribes, maxSales] = [0, 0];
  for (const discounts of allDiscounts) {
    let [totalSubscribes, totalSales] = [0, 0];
    for (const user of users) {
      const [subscribes, sales] = getResult(user, discounts);
      totalSubscribes += subscribes;
      totalSales += sales;
    }
    if (maxSubscribes < totalSubscribes) {
      maxSubscribes = totalSubscribes;
      maxSales = totalSales;
    } else if (maxSubscribes === totalSubscribes) {
      maxSales = Math.max(maxSales, totalSales);
    }
  }
 
  return [maxSubscribes, maxSales];
}