[Java] 배열 n개씩 나누기, 2가지 방법
June 10, 2024
하나의 배열을 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]