본문 바로가기

Study/Algorithm 이론

배열에서의 정렬

1. 배열에서의 정렬


배열은 CRUD를 할 때 가장 기본적으로 사용하며, 생성 당시에 크기가 결정된다. 크기에 따라 인덱스(참조)가 0부터 n까지 부여되며, 이에 따라 인덱스를 통해 값을 조회할 수 있다. 그렇지만 리스트와 다르게 크기를 유동적으로 변경할 수 없다.

 

1-1. Arrays.sort로 오름차순으로 정렬하기

오름차순으로 정렬하기 위해서는 보통 Arrays라는 클래스 내부의 sort 메소드를 사용한다.

 

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {

        int numArr = { 5, 1, 4, 2, 6, 3 };

        Arrays.sort(numArr);        // 오름차순으로 정렬

        System.out.println(Arrays.toString(numArr));
        // [1, 2, 3, 4, 5 ,6]

    }
}

 

1-2. Arrays.sort로 내림차순으로 정렬

내림차순으로 정렬하기 위해서는 오름차순 정렬에서 사용한 sort 메소드에 두번째 인자가 추가된다.

 

import java.util.Arrays;
import java.util.Collections;

public class Main {
    public static void main(String[] args) {

        Integer numArr = { 5, 1, 4, 2, 6, 3 };

        Arrays.sort(numArr, Collections.reverseOrder());    //내림차순으로 정렬

        System.out.println(Arrays.toString(numArr));    // 출력
        // [6, 5, 4, 3, 2, 1]

    }
}

 

두번째 인자로 CollectionsreverseOrder 메소드가 사용되며, 이는 객체 형식만 지원하기 때문에 일반적인 자료형에 대한 배열을 정렬할 수는 없다.

 

1-3. 문자열 배열 정렬

문자열로 된 배열도 정렬을 지원하며, 사전식으로 나열되는 것을 볼 수 있다.

int형 배열과 마찬가지로 sort 메소드를 사용할 수 있다. 또한 문자열은 Wrapper Class이기 때문에 역순으로 정렬하는 데 별다른 조치를 취하지 않아도 된다.

 

1-3-1. 오름차순으로 정렬

 

import java.util.Arrays;
import java.util.Collections;

public class Main {
    public static void main(String[] args) {

        String[] strArr = { "가면", "나들이", "가구", "노래듣기", "라디오", "다람쥐" };

        Arrays.sort(strArr);

        System.out.println(Arrays.toString(strArr));
        // [가구, 가면, 나들이, 노래듣기, 다람쥐, 라디오]
    }
}

 

1-3-2. 내림차순으로 정렬

 

import java.util.Arrays;
import java.util.Collections;

public class Main {
    public static void main(String[] args) {

        String[] strArr = { "가면", "나들이", "가구", "노래듣기", "라디오", "다람쥐" };

        Arrays.sort(strArr, Collections.reverseOrder());

        System.out.println(Arrays.toString(strArr));
        // [라디오, 다람쥐, 노래듣기, 나들이, 가면, 가구]
    }
}

 

1-4. Comparator를 사용한 정렬

 

Comparator Interface를 구현하는 방법으로도 정렬을 할 수 있다.

 

import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {

        String[] strArr = { "가면", "나들이", "가구", "노래듣기", "라디오", "다람쥐" };

        System.out.println(Arrays.toString(solutions(strArr, 0)));
        // [가구, 가면, 나들이, 노래듣기, 다람쥐, 라디오]
    }

    // 함수로 구현
    public static String[] solutions(String[] strArr, int n) {
        Arrays.sort(strArr, new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                if (o1.charAt(n) > o2.charAt(n)) {
                    return 1;
                } else if (o1.charAt(n) == o2.charAt(n)) {
                    return o1.compareTo(o2);
                } else {
                    return -1;
                }
            }
        });

        return strArr;
    }
}

 

o1의 값과 o2의 값을 각각 비교하여

(1) 리턴값을 양수로 주면 값을 바꾸고

(2) 음수로 주면 값을 바꾸지 않는다.

 

다음과 같이 오버라이드하여 구현하는 경우 글자 개수가 적은 순으로 사전식 정렬한다.

 

@Override
public int compare(String o1, String o2) {
    if (o1.length() == o2.length()) {
        return o1.compareTo(o2);
    } else {
        return o1.length() - o2.length();
    }
}