문제
마트에서 장을 보고 박스를 포장하려고 합니다. 박스를 포장하는 데는 폭이 너무 좁아서, 한 줄로 서 있어야 하고, 들어온 순서대로 한 명씩 나가야 합니다.
불행 중 다행은, 인원에 맞게 포장할 수 있는 기구들이 놓여 있어, 모두가 포장을 할 수 있다는 것입니다. 짐이 많은 사람은 짐이 적은 사람보다 포장하는 시간이 길 수밖에 없습니다.
뒷사람이 포장을 전부 끝냈어도 앞사람이 끝내지 못하면 기다릴 수밖에 없는 환경입니다. 앞사람이 포장을 끝나면, 포장을 마친 뒷사람들과 함께 한 번에 나가게 됩니다.
만약, 앞사람의 박스는 5 개고, 뒷사람 1의 박스는 4 개, 뒷사람 2의 박스는 8 개라고 가정했을 때, 뒷사람 1이 제일 먼저 박스 포장을 끝내게 되고, 앞사람 1의 포장이 마칠 때까지 기다렸다가 같이 나가게 됩니다.
이때, 통틀어 최대 몇 명이 한꺼번에 나가는지 알 수 있도록 함수를 구현해 주세요.
인자 1:Number 타입을 요소로 갖는, 포장해야 하는 박스가 담긴 배열
Number 타입을 리턴해야 합니다.
사람은 100 명 미만입니다.
박스 개수는 100개 이하입니다.
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);
}
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);
}