택배 배달과 수거하기

Lv. 2

Solution

export function deliveryAndCollect(
  cap: number,
  n: number,
  deliveries: number[],
  pickups: number[],
): number {
  const popUntilNotZero = (stack: number[]) => {
    while (stack.at(-1) === 0) {
      stack.pop();
    }
  };
 
  const popWithCapacity = (stack: number[]) => {
    let remainCapacity = cap;
    while (0 < stack.length && 0 < remainCapacity) {
      const topOfStack = stack[stack.length - 1];
      if (topOfStack <= remainCapacity) {
        remainCapacity -= topOfStack;
        stack.pop();
      } else {
        stack[stack.length - 1] -= remainCapacity;
        remainCapacity = 0;
      }
    }
  };
 
  let answer = 0;
  while (0 < deliveries.length || 0 < pickups.length) {
    popUntilNotZero(deliveries);
    popUntilNotZero(pickups);
    answer += Math.max(deliveries.length, pickups.length) * 2;
    popWithCapacity(deliveries);
    popWithCapacity(pickups);
  }
 
  return answer;
}