[Algorithm], 박스 포장, Queue
마트에서 장을 보고 박스를 포장하려고 한다. 박스를 포장하는 데는 폭이 너무 좁아서, 한 줄로 서 있어야 하고, 들어온 순서대로 한 명씩 나가야 한다. 불행 중 다행은, 인원에 맞게 포장할 수 있는 기구들이 놓여 있어, 모두가 포장을 할 수 있다는 것이다. 짐이 많은 사람은 짐이 적은 사람보다 포장하는 시간이 길 수밖에 없다. 뒷사람이 포장을 전부 끝냈어도 앞사람이 끝내지 못하면 기다릴 수밖에 없는 환경이다. 앞사람이 포장을 끝나면, 포장을 마친 뒷사람들과 함께 한 번에 나가게 된다. 만약, 앞사람의 박스는 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);
}