하나의 배열을 n개의 배열로 잘라서 나누는 방법에 대해서 알아보겠습니다.

1. for문으로 직접 나누는 방법

분할할 배열 개수만큼 for문으로 돌면서, 기존 배열의 값을 새로운 배열에 분리해서 나눌 수 있습니다.

  • subArraySize = originalArray.length / n : 새로운 배열의 크기
  • remainder = originalArray.length % n : n개로 나누고 남은 개수는 remainder에 저장하고, 배열에 나누서 할당
  • for문으로 원본 배열을 순회하면서, n개 또는 n+1개의 새로운 배열을 할당하고 값 복사
  • System.arraycopy(originalArray, startIndex, subArray, 0, subArray.length) : originalArray의 startIndex에서 subArray.length 개수만큼 subArray의 Index 0부터 복사
  • 분리된 배열의 길이가 같거나, remainder에 의해 1개 차이가 있을 수 있음
import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        int[] originalArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
        int n = 3; // 분할할 부분 배열의 개수

        int subArraySize = originalArray.length / n;
        int remainder = originalArray.length % n;

        int startIndex = 0;
        int endIndex;

        for (int i = 0; i < n; i++) {
            endIndex = startIndex + subArraySize + (i < remainder ? 1 : 0);

            int[] subArray = new int[endIndex - startIndex];
            System.arraycopy(originalArray, startIndex, subArray, 0, subArray.length);

            // 부분 배열 출력
            System.out.println("Subarray " + (i + 1) + ": " + Arrays.toString(subArray));

            startIndex = endIndex;
        }
    }
}

Output:

Subarray 1: [1, 2, 3, 4]
Subarray 2: [5, 6, 7, 8]
Subarray 3: [9, 10, 11]

2. Stream을 이용한 방법

Stream과 Collectors.groupingBy()를 이용하여 여러 배열로 분리할 수 있습니다. 대신, 위에서 순차적으로 고정된 개수로 자르는 것이 아닌, 요소 값에 따라서 정해진 그룹으로 분리됩니다.

  • Collectors.groupingBy(i -> i % n) : i % n의 값이 같은 것들끼리 그룹을 만들어 분리합니다. 즉, 분리된 배열의 길이가 각각 다를 수 있습니다. i는 배열의 요소 값이기 때문에, 값에 따라서 그룹의 결과가 달라질 수 있습니다.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Example {

    public static void main(String[] args) {

        int[] originalArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
        int n = 3; // 분할할 부분 배열의 개수

        // 요소 값을 3으로 나눈 결과가 0, 1, 2인 그룹 끼리 배열을 나눔
        List<int[]> subArrays = Arrays.stream(originalArray)
                .boxed()
                .collect(Collectors.groupingBy(i -> i % n))
                .values()
                .stream()
                .map(group -> group.stream()
                        .mapToInt(Integer::intValue)
                        .toArray())
                .collect(Collectors.toList());

        // 분리된 배열 출력
        for (int i = 0; i < subArrays.size(); i++) {
            System.out.println("Subarray " + (i + 1) + ": " + Arrays.toString(subArrays.get(i)));
        }

    }
}

Output:

Subarray 1: [3, 6, 9]
Subarray 2: [1, 4, 7, 10]
Subarray 3: [2, 5, 8, 11]