Java/Short 개발
[Java/Short] 배열/리스트의 요소를 원하는 개수만큼 재 구성 방법
adjh54
2023. 5. 29. 12:30
반응형
해당 글에서는 배열/리스트를 원하는 개수만큼 묶어서 재 구성을 하는 방법에 대해서 공유합니다. 고정된 사이즈 혹은 순차적인 개수로 묶습니다.
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() 메서드를 사용할 수 있습니다.
💡 이 메서드는 지정된 시작 및 끝 인덱스 사이에 있는 리스트의 요소를 반환합니다.
💡 반환된 리스트는 원래 리스트와 같은 객체이므로 원래 리스트를 업데이트하면 반환된 리스트도 업데이트됩니다.
import java.util.*;
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> subList = list.subList(0, 5);
System.out.println("result :: " + subList); // [1, 2, 3, 4, 5]
2. ListIterator를 이용한 방법
💡 이 인터페이스를 사용하면 요소를 반복하면서 리스트를 수정할 수 있습니다. 여기서는 원하는 개수만큼의 요소를 새로운 리스트에 추가하고 반환합니다.
💡 이 방법은 List.subList() 메서드보다 더 많은 코드가 필요하지만, 원하는 요소의 개수를 동적으로 조정할 수 있습니다.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> subList = new ArrayList<>();
ListIterator<Integer> iterator = list.listIterator();
int count = 0;
while(iterator.hasNext() && count < 5) {
subList.add(iterator.next());
count++;
}
[참고] subList() 메서드
💡 이 메서드는 원본 리스트에서 지정된 범위에 해당하는 요소들로 이루어진 새로운 리스트를 반환합니다.
List<E> sublist(int fromIndex, int toIndex)
- fromIndex: 서브리스트의 시작 인덱스를 나타냅니다.
- toIndex: 서브리스트의 끝 인덱스 + 1을 나타냅니다.
- 즉, 반환된 서브리스트는 fromIndex부터 toIndex - 1까지의 요소들로 이루어집니다.
3) 참고
💡 copyOfRange() 함수에 대해 자세히 알고 싶으시면 아래의 글을 참고하시면 도움이 됩니다.
💡 ArrayList의 메서드 API에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
오늘도 감사합니다. 😀
반응형