[알고리즘] 34. Java 정렬 사용법
지난 글에서는 정렬 알고리즘의 기본 개념에 대해 정리했습니다. 이번 글에서는 알고리즘 문제에서 실제로 가장 자주 사용하는 Java 정렬 사용법을 알아보겠습니다.
알고리즘 문제에서는 선택 정렬, 버블 정렬, 삽입 정렬을 직접 구현하기보다 Java에서 제공하는 정렬 기능을 사용하는 경우가 훨씬 많습니다.
Java 정렬의 핵심은 배열은 Arrays.sort(), 리스트는 Collections.sort() 또는 sort()를 사용한다는 것입니다.
1. Java에서 정렬을 왜 사용할까요?
정렬은 알고리즘 문제에서 정말 자주 사용됩니다. 데이터를 특정 기준으로 정리해두면 이후 처리가 쉬워지기 때문입니다.
- 최솟값과 최댓값을 쉽게 찾기
- 중복 값 확인하기
- 이분 탐색 사용하기
- 투 포인터 사용하기
- 문자열 사전순 정렬하기
- 객체를 여러 조건으로 정렬하기
Java에서는 직접 정렬 알고리즘을 구현하지 않아도 기본 제공 메서드로 효율적인 정렬을 사용할 수 있습니다.
2. 배열 정렬에는 Arrays.sort()
배열을 정렬할 때는 Arrays.sort()를 사용합니다. 사용하려면 java.util.Arrays를 import해야 합니다.
import java.util.Arrays;
가장 기본적인 숫자 배열 정렬 예제입니다.
import java.util.Arrays;
int[] numbers = {5, 2, 8, 1, 3};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));
출력 결과는 다음과 같습니다.
[1, 2, 3, 5, 8]
int 배열에 Arrays.sort()를 사용하면 기본적으로 오름차순으로 정렬됩니다.
배열 정렬의 기본은 Arrays.sort(배열)입니다.
3. int 배열 내림차순 정렬 주의하기
int[] 같은 기본형 배열은 Collections.reverseOrder()를 바로 사용할 수 없습니다. 아래 코드는 사용할 수 없습니다.
int[] numbers = {5, 2, 8, 1, 3};
// 불가능
Arrays.sort(numbers, Collections.reverseOrder());
내림차순 정렬을 하고 싶다면 Integer[] 배열을 사용해야 합니다.
import java.util.Arrays;
import java.util.Collections;
Integer[] numbers = {5, 2, 8, 1, 3};
Arrays.sort(numbers, Collections.reverseOrder());
System.out.println(Arrays.toString(numbers));
출력 결과는 다음과 같습니다.
[8, 5, 3, 2, 1]
int[]는 기본형 배열이고, Integer[]는 객체 배열입니다. reverseOrder()는 객체 배열에서 사용할 수 있습니다.
int[] 내림차순 정렬은 바로 되지 않으므로 Integer[] 사용을 고려해야 합니다.
4. int 배열을 오름차순 정렬 후 뒤집기
int[]를 꼭 사용해야 한다면 오름차순 정렬 후 직접 뒤집는 방법도 있습니다.
import java.util.Arrays;
int[] numbers = {5, 2, 8, 1, 3};
Arrays.sort(numbers);
for (int i = 0; i < numbers.length / 2; i++) {
int temp = numbers[i];
numbers[i] = numbers[numbers.length - 1 - i];
numbers[numbers.length - 1 - i] = temp;
}
System.out.println(Arrays.toString(numbers));
출력 결과는 다음과 같습니다.
[8, 5, 3, 2, 1]
배열의 앞쪽 값과 뒤쪽 값을 서로 교환하면서 뒤집는 방식입니다.
5. 문자열 배열 정렬하기
문자열 배열도 Arrays.sort()로 정렬할 수 있습니다. 기본 정렬 기준은 사전순입니다.
import java.util.Arrays;
String[] words = {"banana", "apple", "carrot"};
Arrays.sort(words);
System.out.println(Arrays.toString(words));
출력 결과는 다음과 같습니다.
[apple, banana, carrot]
문자열은 알파벳 사전순으로 정렬됩니다. 알고리즘 문제에서 단어 정렬, 이름 정렬, 사전순 비교 문제에 자주 사용됩니다.
6. 문자열 배열 내림차순 정렬하기
문자열 배열을 내림차순으로 정렬하려면 Collections.reverseOrder()를 사용할 수 있습니다.
import java.util.Arrays;
import java.util.Collections;
String[] words = {"banana", "apple", "carrot"};
Arrays.sort(words, Collections.reverseOrder());
System.out.println(Arrays.toString(words));
출력 결과는 다음과 같습니다.
[carrot, banana, apple]
사전순의 반대 방향으로 정렬되었습니다.
7. ArrayList 정렬하기
ArrayList를 정렬할 때는 Collections.sort()를 사용할 수 있습니다.
import java.util.ArrayList;
import java.util.Collections;
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(1);
numbers.add(3);
Collections.sort(numbers);
System.out.println(numbers);
출력 결과는 다음과 같습니다.
[1, 2, 3, 5, 8]
리스트도 기본적으로 오름차순으로 정렬됩니다.
배열은 Arrays.sort(), 리스트는 Collections.sort()를 자주 사용합니다.
8. ArrayList 내림차순 정렬하기
ArrayList를 내림차순으로 정렬할 때도 Collections.reverseOrder()를 사용할 수 있습니다.
import java.util.ArrayList;
import java.util.Collections;
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(1);
numbers.add(3);
Collections.sort(numbers, Collections.reverseOrder());
System.out.println(numbers);
출력 결과는 다음과 같습니다.
[8, 5, 3, 2, 1]
리스트는 int[]보다 내림차순 정렬이 편합니다. Integer 객체를 저장하기 때문에 reverseOrder()를 바로 사용할 수 있습니다.
9. list.sort() 사용하기
Java에서는 리스트 자체의 sort() 메서드를 사용할 수도 있습니다.
import java.util.ArrayList;
import java.util.Comparator;
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(1);
numbers.add(3);
numbers.sort(Comparator.naturalOrder());
System.out.println(numbers);
출력 결과는 다음과 같습니다.
[1, 2, 3, 5, 8]
내림차순은 Comparator.reverseOrder()를 사용할 수 있습니다.
numbers.sort(Comparator.reverseOrder());
System.out.println(numbers);
[8, 5, 3, 2, 1]
10. 문자열 길이순 정렬하기
기본 정렬 기준이 아니라 직접 기준을 정하고 싶다면 Comparator를 사용합니다. 예를 들어 문자열을 길이가 짧은 순서로 정렬해보겠습니다.
import java.util.Arrays;
String[] words = {"banana", "kiwi", "apple", "fig"};
Arrays.sort(words, (a, b) -> a.length() - b.length());
System.out.println(Arrays.toString(words));
출력 결과는 다음과 같습니다.
[fig, kiwi, apple, banana]
문자열 길이가 짧은 단어부터 정렬되었습니다.
Comparator를 사용하면 원하는 기준으로 정렬할 수 있습니다.
11. 문자열 길이순 + 사전순 정렬하기
알고리즘 문제에서는 정렬 기준이 하나만 있는 경우보다 여러 개인 경우가 많습니다. 예를 들어 다음 기준으로 정렬한다고 하겠습니다.
- 길이가 짧은 단어가 먼저 온다.
- 길이가 같으면 사전순으로 정렬한다.
import java.util.Arrays;
String[] words = {"banana", "apple", "kiwi", "fig", "car"};
Arrays.sort(words, (a, b) -> {
if (a.length() != b.length()) {
return a.length() - b.length();
}
return a.compareTo(b);
});
System.out.println(Arrays.toString(words));
출력 결과는 다음과 같습니다.
[car, fig, kiwi, apple, banana]
car와 fig는 길이가 3으로 같습니다. 길이가 같으므로 사전순으로 car가 fig보다 앞에 옵니다.
여러 조건 정렬은 1순위 조건을 먼저 비교하고, 같을 때 2순위 조건을 비교합니다.
12. 2차원 배열 정렬하기
2차원 배열을 정렬해야 하는 문제도 자주 나옵니다. 대표적인 예는 좌표 정렬입니다.
다음 기준으로 정렬해보겠습니다.
- x값이 작은 순서로 정렬한다.
- x값이 같으면 y값이 작은 순서로 정렬한다.
import java.util.Arrays;
int[][] points = {
{3, 4},
{1, 5},
{1, 2},
{2, 3}
};
Arrays.sort(points, (a, b) -> {
if (a[0] != b[0]) {
return a[0] - b[0];
}
return a[1] - b[1];
});
for (int[] point : points) {
System.out.println(point[0] + " " + point[1]);
}
출력 결과는 다음과 같습니다.
1 2
1 5
2 3
3 4
x값을 먼저 비교하고, x값이 같은 경우 y값을 비교했습니다.
13. 2차원 배열 내림차순 정렬하기
이번에는 x값을 큰 순서로 정렬하고, x값이 같으면 y값을 작은 순서로 정렬해보겠습니다.
import java.util.Arrays;
int[][] points = {
{3, 4},
{1, 5},
{1, 2},
{3, 1}
};
Arrays.sort(points, (a, b) -> {
if (a[0] != b[0]) {
return b[0] - a[0];
}
return a[1] - b[1];
});
for (int[] point : points) {
System.out.println(point[0] + " " + point[1]);
}
출력 결과는 다음과 같습니다.
3 1
3 4
1 2
1 5
x는 내림차순, y는 오름차순으로 정렬되었습니다.
14. 객체 정렬하기
객체를 정렬해야 하는 경우도 있습니다. 예를 들어 학생 이름과 점수를 저장하고, 점수가 높은 순서로 정렬해보겠습니다.
import java.util.ArrayList;
import java.util.Collections;
class Student {
String name;
int score;
Student(String name, int score) {
this.name = name;
this.score = score;
}
}
public class Main {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("Kim", 80));
students.add(new Student("Lee", 95));
students.add(new Student("Park", 90));
Collections.sort(students, (a, b) -> b.score - a.score);
for (Student student : students) {
System.out.println(student.name + " " + student.score);
}
}
}
출력 결과는 다음과 같습니다.
Lee 95
Park 90
Kim 80
점수가 높은 학생부터 정렬되었습니다.
15. 객체 여러 조건 정렬하기
이번에는 학생을 다음 기준으로 정렬해보겠습니다.
- 점수가 높은 순서로 정렬한다.
- 점수가 같으면 이름 사전순으로 정렬한다.
Collections.sort(students, (a, b) -> {
if (a.score != b.score) {
return b.score - a.score;
}
return a.name.compareTo(b.name);
});
점수가 다르면 점수를 기준으로 정렬합니다. 점수가 같을 때만 이름을 비교합니다.
여러 조건 정렬에서는 조건의 우선순서를 정확히 코드로 옮기는 것이 중요합니다.
16. a - b와 Integer.compare()
Comparator에서 숫자를 비교할 때 흔히 아래처럼 작성합니다.
return a - b; // 오름차순
return b - a; // 내림차순
하지만 값의 범위가 매우 크면 뺄셈 과정에서 오버플로우가 발생할 수 있습니다. 더 안전한 방식은 Integer.compare()를 사용하는 것입니다.
return Integer.compare(a, b); // 오름차순
return Integer.compare(b, a); // 내림차순
알고리즘 입문 단계에서는 a - b 방식도 많이 보지만, 안전하게 작성하려면 Integer.compare()를 익혀두는 것이 좋습니다.
숫자 범위가 클 수 있다면 a - b보다 Integer.compare()가 안전합니다.
17. 정렬의 시간복잡도
Java 내장 정렬은 보통 직접 구현한 O(N²) 정렬보다 훨씬 효율적입니다. 알고리즘 문제에서는 일반적으로 정렬의 시간복잡도를 O(N log N)으로 생각하면 됩니다.
| 작업 | 시간복잡도 |
|---|---|
| 배열 정렬 | O(N log N) |
| 리스트 정렬 | O(N log N) |
| 정렬 후 한 번 순회 | O(N log N) + O(N) |
정렬 후 한 번 더 반복문을 돌더라도 전체적으로는 보통 O(N log N)으로 봅니다. N log N이 N보다 더 큰 영향을 주기 때문입니다.
18. Java 정렬에서 자주 하는 실수
Java 정렬을 사용할 때는 아래 실수를 조심해야 합니다.
- int[]에 Collections.reverseOrder()를 바로 사용하려는 경우
- 내림차순 정렬을 하려고 했는데 오름차순으로 작성하는 경우
- 문자열 비교에 compareTo()를 사용하지 않는 경우
- 여러 조건 정렬에서 1순위 조건이 같을 때의 처리를 빠뜨리는 경우
- 2차원 배열 정렬에서 a[0], a[1] 기준을 헷갈리는 경우
- 객체 정렬에서 기준 필드를 잘못 선택하는 경우
- 정렬하면 원래 인덱스가 바뀐다는 점을 놓치는 경우
- a - b 방식에서 오버플로우 가능성을 고려하지 않는 경우
특히 정렬 후 원래 위치가 필요하다면 값과 인덱스를 함께 저장해야 합니다.
정렬 전 인덱스가 필요하다면
값 + 원래 인덱스를 함께 저장하기
정렬은 데이터 순서를 바꾸므로 원래 순서가 필요한지 먼저 확인해야 합니다.
19. 정리
이번 글에서는 Java 정렬 사용법에 대해 정리했습니다.
- 배열 정렬은 Arrays.sort()를 사용한다.
- 리스트 정렬은 Collections.sort() 또는 list.sort()를 사용할 수 있다.
- int[]는 Collections.reverseOrder()를 바로 사용할 수 없다.
- Integer[]는 reverseOrder()로 내림차순 정렬할 수 있다.
- 문자열은 기본적으로 사전순으로 정렬된다.
- Comparator를 사용하면 원하는 기준으로 정렬할 수 있다.
- 여러 조건 정렬은 1순위 조건을 먼저 비교하고, 같을 때 다음 조건을 비교한다.
- 2차원 배열과 객체도 Comparator로 정렬할 수 있다.
- 정렬의 시간복잡도는 보통 O(N log N)으로 생각한다.
Java 정렬은 알고리즘 문제에서 거의 필수로 사용되는 도구입니다. 처음에는 Arrays.sort()와 Collections.sort()부터 익히고, 그다음 내림차순, 문자열 정렬, 2차원 배열 정렬, 객체 정렬 순서로 확장하면 좋습니다.
Java 정렬의 핵심은 기본 정렬을 빠르게 사용하고, 필요할 때 Comparator로 기준을 직접 만드는 것입니다.
다음 글 예고
다음 글에서는 Comparator에 대해 더 자세히 알아보겠습니다.
compare()의 반환값, 오름차순과 내림차순 기준, 여러 조건 정렬, 객체 정렬에서 Comparator를 어떻게 사용하는지 예제로 정리해보겠습니다.

'Problem Solving > Algorithm' 카테고리의 다른 글
| [알고리즘] 36. 투 포인터 (0) | 2026.07.19 |
|---|---|
| [알고리즘] 35. Comparator 완전 정복 (0) | 2026.07.18 |
| [알고리즘] 33. 정렬 알고리즘 개념 (0) | 2026.07.16 |
| [알고리즘] 32. 최단 거리 기초 (1) | 2026.07.15 |
| [알고리즘] 31. 격자 탐색 (0) | 2026.07.14 |