문제 자체는 어렵지 않지만 알아두면 좋을 개념이 있어서 정리!
package baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main_11650 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[][] a = new int[N][2];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
a[i][0] = Integer.parseInt(st.nextToken());
a[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(a, (e1, e2) -> {
if (e1[0] == e2[0]) {
return e1[1] - e2[1];
} else {
return e1[0] - e2[0];
}
});
for (int i = 0; i < N; i++) {
System.out.println(a[i][0]+" "+a[i][1]);
}
}
}
Comparator 인터페이스를 오버라이딩하여 인자값으로 넘겨 sort 메서드를 사용한다. 구현해준 분기문에 맞게 2차원 배열이 알맞게 정렬되는 걸 확인할 수 있다.
람다식은 익명함수라고도 불리는데 일회성으로 함수를 사용할 경우 메소드를 굳이 만들기보다 위처럼 간결하게 구현하면 된다.
(매개변수1, ...) -> {함수;}
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}
좀 더 궁금해져서 Array 자바 파일을 까봤다.
Comparator 가 없다면 기존 오름차순 정렬을 하고, 있으면 useLegacyMergeSort 설정에 따라 legacyMergeSort나 TimSort를 한다. (기본 설정은 false이므로 TimSort가 진행된다. Tim sort는 Insertion sort와 Merge sort를 결합하여 만든 정렬로 최선의 경우 O(n), 평균적으로 O(n log(n)), 최악의 경우 O(n log(n))의 성능을 제공한다.)