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() 함수에 대해 자세히 알고 싶으시면 아래의 글을 참고하시면 도움이 됩니다.
 

[Java] 배열(Array) 조작 함수 이해하기-1: 기본 구성, Arrays 함수

해당 글의 목적은 주요 배열 조작함수(기본 배열 구성 및 Arrays)를 이해하고 예제를 통한 이해를 돕기 위해 작성한 글입니다. 해당 글에서는 모든 함수에 대해서는 포함하고 있지 않으며 자주 사

adjh54.tistory.com

 

 

💡 ArrayList의 메서드 API에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
 

[Java/API] ArrayList Method API Document : Java 11

해당 글에서는 Java 11 버전을 기준으로 List 인터페이스를 구현한 클래스인 ArrayList의 메서드의 API에 대해서 확인합니다. 1) List / ArrayList 💡 List 란? - 순서가 있는 데이터 집합을 나타내는 ‘인터

adjh54.tistory.com

 

 

 

 

 

오늘도 감사합니다. 😀

 

 

 

반응형