CodeGym/Java Blog/무작위의/Java에서 배열 반전
John Squirrels
레벨 41
San Francisco

Java에서 배열 반전

무작위의 그룹에 게시되었습니다
회원
배열은 코딩에서 자주 사용되며 동일한 유형의 여러 값을 하나의 변수에 저장하는 방법입니다. 코더가 배열을 반전시키려는 데는 여러 가지 이유가 있을 수 있습니다. 예를 들어 문제의 논리가 마지막 요소부터 시작해야 하는 경우 배열을 뒤집을 필요가 있을 수 있습니다. 이 경우 가장 좋은 방법은 반전을 수행한 다음 코드에서 필요한 경우 반전된 배열을 사용하는 것입니다. 더욱이 배열을 뒤집는 것은 Java Juniors 인터뷰에서 매우 인기 있는 작업입니다.

배열을 뒤집는 방법

배열을 뒤집는 방법에는 여러 가지가 있으며 여기서는 5가지를 고려합니다. 옵션 1의 경우 원래 배열의 끝에서 오름차순으로 채워진 추가 배열(내림차순)을 사용하여 배열을 뒤집고 옵션 2에서는 내부 반전을 사용합니다. 시작과 끝의 배열 요소가 교체되는 곳에서 수행됩니다. 옵션 3에서는 컬렉션 프레임워크의 reverse() 메서드를 사용하여 반전을 수행합니다. 옵션 4에서는 List.add()List.remove() 가 사용되고 마지막으로 옵션 5에서 재귀가 사용됩니다.Java에서 배열 반전 - 1

옵션 1: 추가 어레이를 사용하여 어레이 뒤집기

추가 배열을 사용하여 배열을 뒤집는 간단한 방법을 작성해 보겠습니다 . 이 옵션은 원래 배열의 마지막 요소부터 내림차순으로 채워지는 추가 배열을 사용합니다. 즉, 첫 번째 요소는 원래 배열의 마지막 요소와 동일하고 두 번째 요소는 마지막에서 두 번째 요소와 동일하므로 추가 배열이 채워질 때까지 켜집니다.
import java.util.Arrays;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       int[] array = {7, 8, 9, 10, 11};
       System.out.println("Array : " + Arrays.toString(array)); // print array

       // Call function to get reversed array
       int[] reversedArray = reverse(array);
       System.out.println("Reversed array : " + Arrays.toString(reversedArray)); // print reversed array
   }

   // Method returns a new reversed array, based on the array which was passed to it.
   static int[] reverse(int[] array) {
       int[] newArray = new int[array.length];

       for (int i = 0; i < array.length; i++) {
           newArray[array.length - 1 - i] = array[i];
       }

       return newArray;
   }
}
이 예제에서는 배열을 뒤집고 전달된 배열을 기반으로 새로운 반전된 배열을 반환하는 메서드를 작성했습니다. array 가 main 에서 선언된 다음 reverse 메서드가 호출됩니다. 메서드의 인수는 배열입니다. reverse 메서드에서 새 배열 newArray 가 생성되고 array 와 크기가 동일하며 완전히 비어 있습니다. for 루프는 newArray를 채우는 데 사용되며 배열의 전체 길이에서 작동합니다 . 이는 배열의 첫 번째 요소에서 시작하여 newArray 마지막 요소에 할당하여 수행됩니다., 그런 다음 배열 의 두 번째 요소를 가져 와서 newArray 의 두 번째 마지막 요소에 할당하는 식입니다. newArray 는 거꾸로 채워집니다. for 루프가 완료되면 newArray는 완전히 채워지고 array 의 정반대입니다 .
배열 : [7, 8, 9, 10, 11] 반전 배열 : [11, 10, 9, 8, 7]

옵션 2: 배열의 요소를 역순으로 인쇄

배열을 뒤집는 이 옵션의 경우 추가 배열을 사용할 필요가 없으며 배열 목록으로 변환되지 않습니다. 대신 배열 요소가 제자리에서 역순으로 배치됩니다 . 이것은 그들이 실제로 교환되었음을 의미합니다. 첫 번째 요소는 마지막 요소와 교체되고 두 번째 요소는 마지막에서 두 번째 요소로 교체되는 식입니다. for 루프 사용되며 이것이 완료되면 배열이 반전됩니다. 코드는 다음과 같습니다.
import java.util.Arrays;
/*
reversing an array in-place
*/
public class ReverseArrayDemo {

   public static void main(String[] args) {
       int[] array = {1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       arrayReverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }
//arrayReverse is a method that reverses array in-place
   static void arrayReverse(int[] array) {
       for (int i = 0; i < array.length / 2; i++) {
           int temp = array[i];
           array[i] = array[array.length - i - 1];
           array[array.length - i - 1] = temp;
       }
   }
}
원래 배열은 Arrays.toString(array) 를 사용하여 문자열 로 인쇄된 다음 배열이 인수로 reverse 에 전달됩니다 . for 루프의 역방향 방법 에서는 temp라는 변수를 생성하여 사용합니다. for 루프 에서 역순은 세 단계로 이루어집니다.
  1. temp 에 첫 번째 요소 할당
  2. 마지막 요소를 첫 번째 요소에 할당
  3. 마지막 요소에 임시 할당
그런 다음 이번에는 두 번째 요소에 대해 다시 수행되고 마지막 요소에서 두 번째에 대해 수행됩니다. 이것은 배열의 연속적인 요소에 대해 수행되지만 루프는 배열 크기의 절반까지만 반복합니다. 기본적으로 배열의 반대쪽 끝에 있는 요소가 교체됩니다. 이 방법은 0에서 크기로 이동하는 for 루프를 사용하는 방법보다 두 배 빠르게 실행됩니다 . 결과적으로 배열의 역순이 달성되고 배열을 역순으로 인쇄하는 방법과 값이 인쇄됩니다.
반전 전 배열 : [1, 4, 9, 16, 25] 반전 후 배열 : [25, 16, 9, 4, 1]

옵션 3: Collections.reverse() 사용

Java에서는 기존 Collections 프레임워크의 일부인 reverse 메서드를 사용하여 배열을 뒤집을 수 있습니다. 반전을 위해 사용합시다.
import java.util.Arrays;
import java.util.Collections;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = {1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       reverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }
//method that reverses an array
   static void reverse(Integer[] array) {
       Collections.reverse(Arrays.asList(array));
   }
}
main 에서 배열이 생성되고 5개의 숫자가 있는 정수 배열로 채워집니다. 그런 다음 Arrays.asList(array)를 사용하여 목록으로 출력한 다음 reverse 함수를 호출하고 array를 이 함수의 인수로 전달합니다. reverse 에서는 Collections.reverse 가 사용 되며 이것은 배열 자체가 아닌 배열 목록인 Arrays.asList(array) 에서 사용됩니다 . 그런 다음 다음 단계에서는 System.out.println을 사용하여 배열을 역순으로 인쇄하는 방법을 보여줍니다 . 이번에는 각 요소가 같은 줄에 인쇄됩니다.
반전 전 배열 : [1, 4, 9, 16, 25] 반전 후 배열 : [25, 16, 9, 4, 1]

옵션 4: List.add() 및 List.remove()를 사용하여 배열 반전

이 새로운 옵션에서 List.add()List.remove()는 반전을 수행하는 데 사용됩니다. 이것이 작동하는 방식은 배열이 목록으로 변환되고 목록의 마지막 요소가 제거되어 목록의 시작 부분에 배치된다는 것입니다. 전체 목록이 반복된 후 새 목록은 원본의 반전입니다. main() 메서드 에서 5개의 숫자로 구성된 배열이 생성됩니다. 그런 다음 어레이의 원래 상태가 콘솔에 출력됩니다. 그런 다음 이 배열을 reverse() 메서드에 대한 인수로 넣습니다 . 이 방법은 기본적으로 마지막 요소를 제거하고 배열의 앞에 삽입하는 방식으로 작동합니다. 마지막으로 어레이의 새로운(반전된) 상태가 콘솔에 출력됩니다. 반대로 ()메소드에서 배열은 반전을 수행하기 위해 add()remove() 메소드를 활성화하기 위해 Arrays.asList(array) 를 통해 목록에 기록됩니다 . 이 방법은 기본적으로 마지막 요소를 제거하고 배열의 앞에 삽입하는 방식으로 작동합니다. reverse() 가 사용하는 단계는 다음과 같습니다. for 루프를 사용하여 목록 요소의 반전을 수행합니다. 변수 i 를 초기화하여 이를 수행합니다 . 처음에 i는 0으로 설정됩니다 . i = 0 일 때 목록 에서 list.size() - 1 에 있는 요소가 제거되고 i < list.size() - 1 이므로 항상 마지막 요소가 됩니다.. remove() 메서드는 제거한 요소를 반환하므로 이 요소는 이제 인덱스 i = 0 에서 목록에 추가됩니다 . 즉, 처음에 삽입됩니다. 그런 다음 목록의 나머지 부분은 오른쪽으로 이동하지만 새 목록에는 여전히 동일한 수의 요소(예: 크기) 가 있습니다 . i , i = 1 의 다음 값으로 for 루프 실행을 계속하면 동일한 일련의 단계가 수행되어 마지막 요소가 제거되고 i = 1 에서 숫자로 입력되고 목록이 오른쪽으로 이동합니다. 이것은 i 의 마지막 증분 값 과 목록의 모든 요소가 변경될 때까지 계속됩니다. 두 번째 인덱스 i가 있는 목록의 루프 요소는 인덱스 i가 있는 배열 요소로 설정됩니다. 여기서 i 는 0에서 list.size() - 1까지 입니다 . 요약하면 사용된 단계는 다음과 같습니다. 단계:
  1. 나는 = 0
  2. list.size() 에서 요소 제거 - 1
  3. list.size() - 1 , i = 0 에 있던 요소 삽입
  4. 증분 i
  5. i의 마지막 증분 값이 사용될 때까지 2~4단계를 반복합니다(3단계에서 i에 대한 새 값 포함).
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = new Integer[]{1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       reverse(array);
       System.out.println("Array after reverse : " + Arrays.toString(array));
   }

   static void reverse(Integer[] array) {
       List list = new ArrayList<>(Arrays.asList(array));

       for (int i = 0; i < list.size() - 1; i++) {
           list.add(i, list.remove(list.size() - 1));
       }

       for (int i = 0; i < list.size(); i++) {
           array[i] = list.get(i);
       }
   }
}
이 코드는 출력을 제공합니다.
반전 전 배열 : [1, 4, 9, 16, 25] 반전 후 배열 : [25, 16, 9, 4, 1]

옵션 5: 재귀로 배열 반전

재귀 방법은 코딩에서 널리 사용되며 배열을 뒤집는 방법에 대한 효율적인 방법을 만드는 데 사용할 수 있습니다. 이 옵션에서 배열은 목록으로 변환된 다음 목록의 끝에서 마지막 요소를 제거할 때마다 코드가 reverse() 메서드로 이동하고 목록에는 제거된 값이 역순으로 추가됩니다. 이전 방법과 마찬가지로 5개의 숫자로 구성된 배열이 생성됩니다. 그런 다음 함수 reverse() 에 인수로 전달됩니다 . reverse() 에서 수행되는 첫 번째 작업은 배열을 목록으로 바꾸고 목록 크기를 확인하는 것입니다. 요소가 하나만 있거나 null인 경우 메서드가 완료되고 반환됩니다. 그렇지 않은 경우 첫 번째 요소가 제거되지만 Integer 에 복사됩니다., . 그런 다음 reverse() 메서드 가 다시 호출되고 재귀가 다시 시작됩니다. 함수가 입력되면 동일한 단계가 수행됩니다. 크기 검사에서 목록이 1보다 크면 다음 단계는 첫 번째 요소를 제거한 다음 재귀를 다시 수행하는 것입니다. 목록 의 크기가 1 일 때 reverse()는 호출된 위치로 돌아가고 목록에 각 값을 추가하여 원래 목록과 정확히 반대로 만듭니다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ReverseArrayDemo {

   public static void main(String[] args) {
       Integer[] array = new Integer[]{1, 4, 9, 16, 25};
       System.out.println("Array before reverse : " + Arrays.toString(array));

       List list = new ArrayList<>(Arrays.asList(array));
       reverse(list);
       System.out.println("Array after reverse : " + Arrays.toString(list.toArray()));
   }

   public static void reverse(List list) {
       if (list== null || list.size() <= 1) {
           return;
       }

       Integer value = list.remove(0);

       reverse(list);

       list.add(value);
   }
}
출력은 다음과 같습니다.
반전 전 배열 : [1, 4, 9, 16, 25] 반전 후 배열 : [25, 16, 9, 4, 1]

결론

그래서 여기서 우리는 배열을 뒤집는 5가지 다른 방법을 살펴보았습니다. Collections 프레임워크를 사용하는 옵션 3은 아마도 Collections.reverse가 이미 존재하고 시도되고 테스트된 Java 함수 이기 때문에 사용하기에 가장 좋은 방법일 것입니다 . 물론 특히 학습하는 동안 다른 옵션을 사용할 수 있지만 일반적으로 표준 방법이 있는 경우 일반적으로 고도로 최적화되고 테스트되기 때문에 표준 방법이 가장 좋습니다. 그러나 이것은 좋은 코딩 연습이고 Java Junior 인터뷰에서 성공하는 데 도움이 되므로 이러한 메서드를 직접 만들 수 있습니다.
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다