Maximum Ice Cream Bars

MediumArrayGreedySortingCounting Sort

Solution

export function maxIceCream(costs: number[], coins: number): number {
  const maxCost = costs.reduce((maxCost, cost) => Math.max(maxCost, cost), 0);
  const costsFrequency = new Array<number>(maxCost + 1).fill(0);
  for (const cost of costs) {
    costsFrequency[cost] += 1;
  }
 
  let [iceCreamCount, cost] = [0, 1];
  while (cost <= maxCost && cost <= coins) {
    if (0 < costsFrequency[cost]) {
      const count = Math.min(costsFrequency[cost], Math.floor(coins / cost));
      coins -= cost * count;
      iceCreamCount += count;
    }
    cost += 1;
  }
 
  return iceCreamCount;
}