Queue 문제는 제대로 풀지 못해서 실패한 코드와 왜 실패했는지, 레퍼런스 코드는 어떤 방식으로 풀었는지 정리했습니다.🚀
문제
만약, 앞사람의 박스는 5 개고, 뒷사람 1의 박스는 4 개, 뒷사람 2의 박스는 8 개라고 가정했을 때, 뒷사람 1이 제일 먼저 박스 포장을 끝내게 되어도 앞사람 1의 포장이 마칠 때까지 기다렸다가 같이 나가게 됩니다.
이때, 통틀어 최대 몇 명이 한꺼번에 나가는지 알 수 있도록 함수를 구현해 주세요.
예시
1 | const boxes = [5, 1, 4, 6]; |
실패 코드
1 | function paveBox(boxes) { |
🫥 무엇이 잘못되었을까?
처음 문제를 봤을 때 첫 번째 사람이 작업을 끝냈을 때 즉, boxes[0]이 0일 때, 뒤에 연속으로 0인 요소의 갯수를 세면 되지 않을까?
라는 아이디어를 가지고 문제를 풀었습니다.
하지만 이 아이디어에 오류가 있었는데요, 첫 번째로 한꺼번에 나간 뒤에 상황을 고려하지 않았다는 겁니다. 제 코드는 0번째 사람이 작업을 끝내고 나서 한꺼번에 나간 사람의 수만 리턴하고 있기 때문이죠
그럼 어떻게 풀어야할까요?
Reference 코드
Reference Code의 Pseudo code는 다음과 같습니다.
- 최대 나간 사람의 수를 담을 수 있는 배열(answer)를 선언한다.
- while문 👉🏻 boxes 배열이 0보다 클 때가지 반복한다.
- findIndex 메서드를 사용해서 boxes[0]번째보다 큰 수가 존재하기 전까지의 index를 구한다.
- 만약 findIndex가 -1이라면?
- boxes[0]번째가 가장 크다는 의미
- answer에 boxes.length를 넣고 boxes를 빈 배열로 초기화한다.
- findIndex가 존재한다면?
- 해당 인덱스를 answer에 넣고 boxes에서 그만큼을 제외한다.
- answer에 존재하는 값 중 가장 큰 값을 반환한다.
1 | function paveBox(boxes) { |
다른 사람의 풀이
1 | function paveBox(boxes) { |
👉🏻 배열을 건드리지 않아도 되는 간단한 코드를 만들 수도 있구나!라는 생각을 하게되었습니다. 다른 사람의 코드를 보는 게 굉장한 도움이 되는 것 같습니다:)
(알려주신 즨솔님께 감사를 표하며,,,)