1 minute read

마트에서 장을 보고 박스를 포장하려고 한다. 박스를 포장하는 데는 폭이 너무 좁아서, 한 줄로 서 있어야 하고, 들어온 순서대로 한 명씩 나가야 한다. 불행 중 다행은, 인원에 맞게 포장할 수 있는 기구들이 놓여 있어, 모두가 포장을 할 수 있다는 것이다. 짐이 많은 사람은 짐이 적은 사람보다 포장하는 시간이 길 수밖에 없다. 뒷사람이 포장을 전부 끝냈어도 앞사람이 끝내지 못하면 기다릴 수밖에 없는 환경이다. 앞사람이 포장을 끝나면, 포장을 마친 뒷사람들과 함께 한 번에 나가게 된다. 만약, 앞사람의 박스는 5 개고, 뒷사람 1의 박스는 4 개, 뒷사람 2의 박스는 8 개라고 가정했을 때, 뒷사람 1이 제일 먼저 박스 포장을 끝내게 되고, 앞사람 1의 포장이 마칠 때까지 기다렸다가 같이 나가게 된다. 이때, 통틀어 최대 몇 명이 한꺼번에 나가는지 알 수 있도록 함수를 구현하라.

입력 인자1 : boxes

  • Number 타입을 요소로 갖는, 포장해야 하는 박스가 담긴 배열

출력

  • number 타입을 리턴한다.

주의사항

  • 사람은 100명 미만이다.
  • 박스 개수는 100개 이하이다.
function paveBox(boxes) {
  // 빈 queue를 선언해준다.
  let queue = [];

  // boxes가 빈배열이 될때까지 반복.
  while (boxes.length > 0) {
    // boxes에 boxes[0]보다 큰 요소의 인덱스를 findIndex를 이용해 구한 뒤 lastIndex에 할당해준다.
    let lastIndex = boxes.findIndex((el) => el > boxes[0]);
    // 만약 boxes에 boxes[0]보다 큰 요소가 없다면, (-1)
    if (lastIndex === -1) {
      // queue에 boxes의 길이를 넣어주고, boxes를 0부터 boxes.length까지 splice해준다
      queue.push(boxes.length);
      // (boxes의 원본 변경으로 반복하다 boxes를 빈배열로 만들어 반복문 탈출하기 위함)
      boxes.spilce(0, boxes.length);
      // 그게 아니라면,
    } else {
      // queue에 lastIndex를 넣어준다. lastIndex는 boxes[0]부터 나갈 수 있는 녀석들의 수.
      queue.push(lastIndex);
      // boxes를 0부터 lastIndex까지 splice해준다. 그러면 처음 그룹이 빠지고,
      // 다시 반복문을 돌면서 뒤의 그룹을 구하게된다.
      boxes.splice(0, lastIndex);
    }
  }
  // queue에 들어간 그룹들을 스프레드로 푼뒤 가장 큰 수를 리턴한다.
  return Math.max(...queue);
}

Updated: