박스 포장

Creating the dots·2021년 8월 15일
0

Algorithm

목록 보기
8/65

문제

마트에서 장을 보고 박스를 포장하려고 합니다. 박스를 포장하는 데는 폭이 너무 좁아서, 한 줄로 서 있어야 하고, 들어온 순서대로 한 명씩 나가야 합니다.

불행 중 다행은, 인원에 맞게 포장할 수 있는 기구들이 놓여 있어, 모두가 포장을 할 수 있다는 것입니다. 짐이 많은 사람은 짐이 적은 사람보다 포장하는 시간이 길 수밖에 없습니다.

뒷사람이 포장을 전부 끝냈어도 앞사람이 끝내지 못하면 기다릴 수밖에 없는 환경입니다. 앞사람이 포장을 끝나면, 포장을 마친 뒷사람들과 함께 한 번에 나가게 됩니다.

만약, 앞사람의 박스는 5 개고, 뒷사람 1의 박스는 4 개, 뒷사람 2의 박스는 8 개라고 가정했을 때, 뒷사람 1이 제일 먼저 박스 포장을 끝내게 되고, 앞사람 1의 포장이 마칠 때까지 기다렸다가 같이 나가게 됩니다.
이때, 통틀어 최대 몇 명이 한꺼번에 나가는지 알 수 있도록 함수를 구현해 주세요.

입력

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

출력

Number 타입을 리턴해야 합니다.

주의사항

사람은 100 명 미만입니다.
박스 개수는 100개 이하입니다.

queue를 이용한 방법 - shift, push

function paveBox(boxes){
  const queue = [...boxes]; //원본을 직접 변경하지 않기 위해 queue 생성
  const countArr = []; //한번에 나가는 인원을 요소로 갖는 배열
  let count = 1; //첫번째 사람을 포함하므로 1부터 시작
  
  let cur = queue.shift(); 
  while(queue.length>0){
    if(cur>=queue[0]){
      count++;
      queue.shift();
    }else{
      countArr.push(count);
      count=1;
      cur = queue.shift();
    }
  }
  countArr.push(count); 
  //while문이 동작할때 cur >= queue 마지막 요소인 경우는 
  //while문이 끝나도 countArr에 count가 들어가지 않기 때문에
  //countArr.push(count)를 꼭 써줘야한다
  return Math.max(...countArr);
}

reference - findIndex, splice

function paveBox(boxes){
  let answer = [];
  while(boxes.length>0){
    let finishIndex = boxes.findIndex((fn)=>boxes[0]<fn);
    //boxes 배열을 순회하면서 boxes[0]보다 큰 요소가 없어서 (작거나 같다는 의미) finishIndex가 -1인 경우
    if(finishIndex === -1){ 
      answer.push(boxes.length);
      boxes.splice(0,boxes.length);
    }
    //boxes 배열을 순회하면서 boxes[0]보다 큰 요소가 있고, finishIndex에 해당 요소의 인덱스가 담긴 경우
    else{
      answer.push(finishIndex);
      boxes.splice(0,finishIndex);
    }
  }
  return Math.max(...answer);
}
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글