배열 요소를 역순으로 정렬하기

정순동·2024년 1월 24일

알고리즘

목록 보기
7/33

배열 요소를 역순으로 방법은 매우 많다.
알고리즘과 for문을 이용해 뒤집는 메서드를 만들거나,
배열 요소에 따라 comparator, comparable을 다시 구현해서 Arrays.sort메서드에 넣어 역순으로 바꾸는 방법도 있을 것이다.

이번에는 알고리즘을 통해 배열을 역순으로 바꿔보자.

배열 길이가 7일 때, a[0]-a[6], a[1]-a[5], a[2]-a[4] 이렇게 3군데만 바꿔주면 된다. (홀수는 가온데 숫자의 index가 변하지 않을것이기에)
배열의 길이가 8일 때, a[0]-a[7], a[1]-a[6], a[2]-a[5], a[3]-a[4] 이렇게 바꿔주면 된다 따라서 교환 횟수는 '요솟수/2'가 된다. 자바에서는 정수형으로 / 연산 시, 몫만 가지고 나머지는 버리기 때문이다.

변수 i값을 0,1,...로 증가시키는 방법을 통해 요솟수가 n인 배열의 처리 과정을 간단히 나타내면 다음과 같다.

  1. 왼쪽 요소의 인덱스 = i
    n이 7이면 0 > 1 > 2

  2. 오른쪽 요소의 인덱스 = n - i - 1
    n이 7이면 6 > 5 > 4

따라서 요솟수가 n인 배열 요소를 역순으로 정렬하는 알고리즘을 코드로 나타내면 아래와 같다

	for (int i = 0; i < n / 2; i++)
    	// a[i]와 a[n-i-1]의 값을 교환

두 값을 교환하는 방법은 무엇일까?
다들 알고 있겠지만 배열만 가지고 순서를 교환할 순 없다.
길이가 7인 배열 역순으로 정렬하기 위해 a[0] = a[6]; 이라는 코드를 작성해 버리면 a[0]에 원래 저장돼 있던 정보는 사라진다. 따라서 이를 위해 t라는 임의의 변수를 만들어 준다.

	int[] a = {0,1,2,3,4,5,6};
    int t = 0; // temp라는 뜻
	
    t = a[0]; // 임시 변수에 a[0]값을 잠시 저장,
    a[0] = a[6]; // a[6]의 값을 a[0]에 저장, 원래 a[0]의 값은 사라짐.
    a[6] = t; // 임시 저장해 두었던 a[0]의 값을 a[6]에 저장.
    // 반복

이 알고리즘을 메서드로 완성하면 아래와 같다.

	static void swap(int[] a, int i1, int i2) {
    	int t = a[i1]; a[i1] = a[i2]; a[i2] = t;
    }
    static void reverse(int[] a) {
    	for (int i = 0; i < a.length / 2; i++)
        	swap(a, i, a.length - i - 1);
    }

이렇게 int[] 배열의 참조변수를 reverse메서드에 넣어주면 swap메서드를 자동으로 호출 해 배열을 역순으로 정렬한다.

0개의 댓글