Javascript/코딩 테스트

[코딩 테스트, javascript] 배열의 균질적 분할 로직

tea-tea 2024. 9. 26. 11:10

로직의 목표

  • 배열 A를 넘겨주고 maxLength x를 넘겨주면, 해당 배열을 최대 길이 x를 넘지 않는 배열들의 배열(2차원 배열)로 반환.
  • 각 배열은 다른 배열과 길이가 2이상 차이나면 안됨.

정리하자면, 최대 길이에 맞게 배열을 분할하되, 균질하게 요소를 나눠야 한다.

 

function evenlySplitArray(arr, maxLength) {
  const result = [];
  const splitArrayLength = Math.ceil(arr.length / maxLength); // 필요한 배열의 갯수
  const baseSize = Math.floor(arr.length / splitArrayLength); // 분할된 배열의 기본 크기(최소 크기)
  const extraLength = arr.length % splitArrayLength; // 기본 크기에 따라 분할하고 남는 나머지 갯수

  Array.from({ length: splitArrayLength }).forEach((_, idx) => {
    // 나머지가 없을 때까지 분할할 배열에 요소 추가
    const currentSize = baseSize + (idx < extraLength ? 1 : 0);
    result.push(arr.slice(idx * currentSize, (idx + 1) * currentSize));
  });

  return result;
}

 

테스트 코드

console.log(
  evenlySplitArray(
    Array.from({ length: 72 }, (_, idx) => idx),
    13
  )
);

/**
결과
[
    [0, 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, 32, 33, 34, 35],
    [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47],
    [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
    [60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71]
]
*/