~2022 작성 글/TIL
TIL 10 코드 리뷰 (2021.10.08)
라마치
2021. 10. 16. 21:48
function paveBox(boxes) {
//뒷사람이 포장을 전부 끝냈어도 앞사람이 끝내지 못하면 기다릴 수밖에 없는 환경입니다.
//앞사람이 포장을 끝나면, 포장을 마친 뒷사람들과 함께 한 번에 나가게 됩니다.
//이때, 통틀어 최대 몇 명이 한꺼번에 나가는지 알 수 있도록 함수를 구현해 주세요.
// 앞의 사람의 박스가 많다면, 뒤에가 빨리 끝나더라도 기다려야 한다.
// 최대 몇 명 나가는 지 확인하기 위해서, 해당 사람들과 비교를 해봐야 한다.
let maxBox = 0; // boxes에서 가장 갯수가 많은 박스를 지정한다.
let maxNum = 0; // 한꺼번에 나가는 사람 수 중 가장 큰 수를 찾는다.
let num = 0; // maxBox에 대해 한꺼번에 나가는 사람들의 수
for ( let n = 0; n < boxes.length; n++ ) { // boxes를 순회한다.
if ( boxes[n] > maxBox ) { // 만약에 maxBox 보다 더 큰 박스수를 찾는다면,
maxBox = boxes[n] // 해당 박스 수가 maxBox가 된다.
if ( maxNum > num ) { // maxNum이 maxBox까지의 박스 수보다 크다면,
num = 1; // num은 해당 박스부터 갯수를 다시 시작한다.
}
else { // num가 maxNum보다 더 크다면,
maxNum = num; //maxNum은 num이 되고,
num = 1; // 해당 박스를 포함하기 때문에 num = 1이 된다.
}
}
else if ( boxes[n] <= maxBox ) { // maxBox 보다 boxes[n]가 작다면,
num += 1;
}
}
if ( maxNum > num) { // 마지막까지 돌고 나서, num이랑 maxnum을 비교한다.
return maxNum;
}
else {
return num;
}
}
레프런스(이하 레프)
function paveBox(boxes) {
let answer = [];
// boxes 배열이 0보다 클 때까지 반복합니다.
while(boxes.length > 0){
let finishIndex = boxes.findIndex((fn) => boxes[0] < fn);
if(finishIndex === -1){
// 만약 찾지 못했다면 answer에 boxes 배열의 길이를 넣은 후, boxes 내부의 요소를 전부 삭제합니다.
answer.push(boxes.length);
boxes.splice(0, boxes.length);
} else {
// 만약 찾았다면, 해당 인덱스를 answer에 넣고, boxes에서 그만큼 제외합니다.
// 큰 수의 앞에까지 나가기 때문에 인덱스로써 표현을 할 수 있습니다.
answer.push(finishIndex);
boxes.splice(0, finishIndex);
}
}
// 결과물을 반환합니다.
return Math.max(...answer);
}
레프에서는 findIndex 라는 함수를 이용해서 boxes의 0번째 인덱스보다 더 큰 인덱스 중 가장 첫번째 인덱스를 찾아서 해결을 진행했습니다.
0번째 인덱스보다 더 큰 숫자가 없다면 => 박스의 길이를 answer에다가 넣고, 박스 전체를 잘라서 while문이 끝나도록 합니다.
0번째 인덱스보다 더 큰 숫자가 있다면 => 해당 인덱스를 answer에다가 넣고, boxes에서 해당 인덱스까지는 삭제시키고 다시 while을 돌리게 됩니다. => 더 큰 숫자 앞에까지는 0번째 인덱스와 함께 나갈 수 있기 때문에 나가는 사람의 수가 될 수 있습니다!
이렇게 while이 돌게 된다면, answer의 가장 큰 수를 리턴함으로써 한 번에 나갈 수 있는 가장 많은 사람의 수를 찾을 수 있습니다.
이 코드를 보면서, findIndex를 배울 수 있었습니다. 하지만 바로 보자마자 이해가 되지는 않아서 직접 손으로 그려봤고 덕분에 이해가 될 수 있었습니다. 아직은 레프같은 코드를 구사하기에는 많이 부족하구나 라는 생각을 했습니다.
다음에는 꼭 이런 코드를 구현할 수 있도록 노력해야겠습니다.
Array.prototype.findIndex() 출처 MDN
findIndex() 메서드는 주어진 판별 함수를 만족하는 배열의 첫 번째 요소에 대한 인덱스를 반환합니다. 만족하는 요소가 없으면 -1을 반환합니다.
const array1 = [5, 12, 8, 130, 44];
const isLargeNumber = (element) => element > 13;
console.log(array1.findIndex(isLargeNumber));
// expected output: 3