해당 글에서는 배열/리스트를 원하는 개수만큼 묶어서 재 구성을 하는 방법에 대해서 공유합니다. 고정된 사이즈 혹은 순차적인 개수로 묶습니다.
1) 배열의 요소를 원하는 개수만큼 배열로 재구성 방법
1. 지정한 크기의 인덱스로 재 구성 방법
💡 해당 방법은 요소가 총 6개인 배열이 있다고 가정하였을 때, 첫 번째는 인덱스 0, 1, 2를 하나의 묶음으로 하고 두 번째는 3, 4, 5를 하나의 묶음으로 하는 배열로 재구성을 위한 방법입니다.
💡 아래의 예시를 통해서 해당 방법에 대해 익힙니다.
1.1. 재구성한 배열의 요소의 합을 구하는 방법
💡 해당 예시에서는 순회하면서 k 만큼 묶는 방법을 의미합니다.
💡 아래에서는 배열에서 0, 1, 2번 요소를 한 묶음으로 하고 3, 4, 5번을 한 묶음으로 하여 묶음의 합을 구합니다
int[] estimates = {5, 1, 9, 8, 10, 5}; // 배열의 값
int k = 3; // 묶으려는 요소
List<Integer> sumList = new ArrayList<>();
// [STEP1] 배열을 순회하면서 3개의 요소씩 묶습니다.
for (int i = 0; i < estimates.length; i += k) {
// 요소 값을 추출하여서 합합니다.
int estimateItemSum = estimates[i] + estimates[i + 1] + estimates[i + 2];
sumList.add(estimateItemSum);
}
int maxValue = Collections.max(sumList);
1.2. 묶은 배열을 다른 배열로 재구성하는 방법
💡 해당 예시에서는 순회하면서 k 만큼 묶는 방법이며, 이를 통해 배열을 재구성합니다.
💡 아래의 예시에서는 배열을 순회하면서 k만큼의 인덱스를 증가하면서 요소를 가져옵니다. 이를 통해 copyOfRange 함수를 통해서 i에서 i+k 만큼의 배열을 재구성합니다. 💡 [참고] Arrays.copyOfRange()를 이용하면 인덱스의 값이 존재하지 않으면 null 값이 배열 안에 들어갑니다.
String[] estimates = {"apple", "banana", "mongo", "apple", "banana" }; // 배열의 값
int k = 3; // 묶으려는 요소
for (int i = 0; i < estimates.length; i += k) {
String[] copyArr = Arrays.copyOfRange(estimates, i, i + k);
if (Arrays.asList(copyArr).contains("banana")) answer += 1;
}
2. 지정한 크기의 순차적으로 재 구성방법
💡 해당 방법은 요소가 총 6개인 배열이 있다고 가정하였을 때, 첫 번째는 인덱스 0, 1, 2를 하나의 묶음으로 하고 두 번째는 1, 2, 3을 하나의 묶음하고 세 번째는 2, 3, 4를 하나의 묶음으로 하고 네 번째는 3, 4, 5를 하나의 묶음으로 하는 방식입니다.
💡 아래의 예시를 통해서 해당 방법에 대해 익힙니다.
1. 인덱스를 이용한 방법
💡 해당 예시에서는 순회하면서 k 만큼 순차적으로 묶는 방법을 의미합니다. 💡 아래에서는 배열에서 0, 1, 2번 요소를 한 묶음으로 하고 1, 2, 3번을 한 묶음으로 하고 2, 3, 4번을 하나의 묶음으로 합니다. 또한 i + k < estimates.length 조건을 줌으로써 IndexOutOfBoundException에 대해서 방지합니다.
int[] estimates = {5, 1, 9, 8, 10, 5}; // 배열의 값
int k = 3; // 묶으려는 요소
List<Integer> sumList = new ArrayList<>(); // 합을 담는 리스트
for (int i = 0; i < estimates.length; i++) {
if (i + k < estimates.length) {
int estimateItemSum = estimates[i] + estimates[i + 1] + estimates[i + 2];
sumList.add(estimateItemSum);
}
}
int maxValue = Collections.max(sumList);
2. Arrays.copyOfRange()를 이용한 방법
💡 해당 예시에서는 순회하면서 k 만큼 순차적으로 묶는 방법을 의미합니다.
💡 동일하게 위에서 사용하는 예시와 다르게 배열을 순회하면서 index의 증감을 순차적으로 둠으로 순차적으로 요소를 가져오는 처리를 수행하도록 구성하였습니다.
int[] estimates = {5, 1, 9, 8, 10, 5}; // 배열의 값
int k = 3; // 묶으려는 요소
List<Integer> sumList = new ArrayList<>(); // 합을 담는 리스트
// [STEP1] 배열을 순회하면서 요소값을 추출합니다.
for (int i = 0; i < estimates.length; i++) {
// [STEP2] 배열의 요소를 k 만큼 묶습니다.
int[] rangeArr = Arrays.copyOfRange(estimates, i, i + k);
// [STEP3] 묶은 값을 합합니다.
sumList.add(Arrays.stream(rangeArr).sum());
}
int maxValue = Collections.max(sumList);
2) 리스트의 요소를 원하는 개수만큼 배열로 재구성 방법
1. List.subList()를 이용한 방법
💡 리스트의 요소를 원하는 개수만큼 재 구성하려면 List.subList() 메서드를 사용할 수 있습니다. 💡 이 메서드는 지정된 시작 및 끝 인덱스 사이에 있는 리스트의 요소를 반환합니다. 💡 반환된 리스트는 원래 리스트와 같은 객체이므로 원래 리스트를 업데이트하면 반환된 리스트도 업데이트됩니다.
💡 이 인터페이스를 사용하면 요소를 반복하면서 리스트를 수정할 수 있습니다. 여기서는 원하는 개수만큼의 요소를 새로운 리스트에 추가하고 반환합니다. 💡 이 방법은 List.subList() 메서드보다 더 많은 코드가 필요하지만, 원하는 요소의 개수를 동적으로 조정할 수 있습니다.