티스토리 뷰

문제풀이

[코플릿]박스 포장

네스사 2023. 5. 10. 21:18

문제

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

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

뒷사람이 포장을 전부 끝냈어도 앞사람이 끝내지 못하면 기다려야 합니다. 앞사람이 포장을 끝내면, 포장을 마친 뒷사람들과 함께 한 번에 나가게 됩니다.

만약, 앞사람의 박스는 5 개고, 뒷사람 1의 박스는 4 개, 뒷사람 2의 박스는 8 개라고 가정했을 때, 뒷사람 1이 제일 먼저 박스 포장을 끝내게 되어도 앞사람 1의 포장이 마칠 때까지 기다렸다가 같이 나가게 됩니다.

이때, 통틀어 최대 몇 명이 한꺼번에 나가는지 알 수 있도록 함수를 구현해 주세요.

입력

인자 1 : boxes

  • Number 타입을 요소로 갖는, 포장해야 하는 박스가 담긴 배열
    • 1 ≤ 사람 수 ≤ 10,000
    • 1 ≤ 박스 ≤ 10,000

출력

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

주의 사항

  • 먼저 포장을 전부 끝낸 사람이 있더라도, 앞사람이 포장을 끝내지 않았다면 나갈 수 없습니다.

예시

만약 5, 1, 4, 6이라는 배열이 왔을 때, 5개의 박스를 포장하는 동안 1, 4 개의 박스는 포장을 끝내고 기다리게 되고, 6 개의 박스는 포장이 진행 중이기 때문에, 5, 1, 4 세 개가 같이 나가고, 6이 따로 나가게 됩니다. 그렇기에 최대 3 명이 같이 나가게 됩니다.

const boxes = [5, 1, 4, 6];
const output = paveBox(boxes);
console.log(output); // 3

const boxes2 = [1, 5, 7, 9];
const output2 = paveBox(boxes2);
console.log(output2); // 1

 

 

 

풀이


function paveBox(boxes) {
    let answer = []; // 한꺼번에 나갈 수 있는 사람들의 수를 저장할 배열
    
    while(boxes.length > 0) { // boxes 배열이 비어있지 않은 동안 반복
        let finishIndex = boxes.findIndex(fn => boxes[0] < fn); // 현재 박스 개수보다 큰 값이 처음으로 나오는 인덱스를 찾음
        
        if(finishIndex === -1) { // 현재 박스 개수보다 큰 값이 없는 경우
            answer.push(boxes.length); // 한꺼번에 나갈 수 있는 사람들의 수로 boxes 배열의 길이를 answer 배열에 추가
            boxes.splice(0, boxes.length); // boxes 배열을 비움
        } else { // 현재 박스 개수보다 큰 값이 있는 경우
            answer.push(finishIndex); // 한꺼번에 나갈 수 있는 사람들의 수로 finishIndex를 answer 배열에 추가
            boxes.splice(0, finishIndex); // boxes 배열에서 0부터 finishIndex까지의 요소를 제거
        }
    }

    return Math.max(...answer); // answer 배열의 최대값을 반환하여 한꺼번에 나갈 수 있는 사람들의 최대 수를 반환
}
  • findIndex 메서드를 사용하여 현재 박스 개수보다 큰 값이 처음으로 나오는 인덱스를 찾습니다.
  • 만약 현재 박스 개수보다 큰 값이 없는 경우, answer 배열에 boxes 배열의 길이를 추가하여 한꺼번에 나갈 수 있는 사람들의 수로 저장합니다. 그리고 boxes 배열을 비웁니다.
  • 현재 박스 개수보다 큰 값이 있는 경우, answer 배열에 finishIndex를 추가하여 한꺼번에 나갈 수 있는 사람들의 수로 저장합니다. 그리고 boxes 배열에서 0부터 finishIndex까지의 요소를 제거합니다.
  • 반복이 완료되면, answer 배열의 최대값을 반환하여 한꺼번에 나갈 수 있는 사람들의 최대 수를 반환합니다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함