| 문제 | 난이도 | 핵심 |
|---|---|---|
| 1181번 — 단어 정렬 | 실버 V | 다중 조건 정렬 |
| 11650번 — 좌표 정렬하기 | 실버 V | 2차원 좌표 정렬 |
| 11651번 — 좌표 정렬하기 2 | 실버 V | y 기준 정렬 |
| 10814번 — 나이순 정렬 | 실버 V | 안정 정렬 |
| 1946번 — 신입 사원 | 실버 I | 정렬 + 그리디 |
| 2751번 — 수 정렬하기 2 | 실버 V | 기본 정렬 |
Java에서 객체를 원하는 기준으로 정렬할 때 사용하는 인터페이스다.
기본 Arrays.sort()는 오름차순만 지원하지만, Comparator를 사용하면 어떤 기준으로든 정렬할 수 있다.
Comparator의 핵심은 compare(o1, o2)의 반환값이다.
| 반환값 | 의미 | 결과 |
|---|---|---|
| 음수 | o1이 o2보다 앞 | o1 → o2 순서 유지 |
| 0 | o1과 o2 동일 | 순서 변경 없음 |
| 양수 | o1이 o2보다 뒤 | o2 → o1 순서로 바뀜 |
// o1 - o2 → 오름차순
// o2 - o1 → 내림차순
Integer[] arr = {3, 1, 4, 1, 5, 9};
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; // 내림차순
}
});
Arrays.sort(arr, (o1, o2) -> o2 - o1); // 내림차순
// 오름차순 (기본값과 동일)
Arrays.sort(arr, (o1, o2) -> o1 - o2);
// 내림차순
Arrays.sort(arr, (o1, o2) -> o2 - o1);
String[] words = {"banana", "apple", "kiwi"};
Arrays.sort(words, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length(); // 길이 오름차순
}
});
// 1181번 단어 정렬 핵심 패턴
Arrays.sort(words, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.length() != o2.length()) {
return o1.length() - o2.length(); // 1차: 길이 오름차순
}
return o1.compareTo(o2); // 2차: 사전순
}
});
// 11650번 좌표 정렬하기 핵심 패턴
int[][] points = {{3, 4}, {1, 2}, {1, 5}};
Arrays.sort(points, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] != o2[0]) {
return o1[0] - o2[0]; // 1차: x 오름차순
}
return o1[1] - o2[1]; // 2차: y 오름차순
}
});
List<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5));
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2; // 오름차순
}
});
// Collections.sort도 동일
Collections.sort(list, (o1, o2) -> o1 - o2);
값의 범위가 클 때 o1 - o2 방식은 오버플로우가 발생할 수 있다.
// 위험 — 값이 클 때 오버플로우 가능
return o1 - o2;
// 안전 — Integer.compare 사용
return Integer.compare(o1, o2);
int[]는 기본형이라 Comparator를 바로 사용할 수 없다. Integer[]로 선언하거나 2차원 배열을 사용해야 한다.
// 불가
int[] arr = {3, 1, 4};
Arrays.sort(arr, (o1, o2) -> o2 - o1); // 컴파일 에러
// 가능
Integer[] arr = {3, 1, 4};
Arrays.sort(arr, (o1, o2) -> o2 - o1);
| Comparator | Comparable | |
|---|---|---|
| 위치 | 외부 클래스에 정의 | 정렬 대상 클래스 내부에 정의 |
| 메서드 | compare(o1, o2) | compareTo(o) |
| 기준 수 | 여러 기준 가능 | 하나의 기준만 |
| 코테 활용 | 자주 사용 | 가끔 사용 |
코테에서는 대부분 Comparator를 사용한다.