~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