

주어진 문제는 2차원 좌표가 주어졌을 때, x좌표가 증가하는 순으로, 그리고 x좌표가 같다면 y좌표가 증가하는 순서로 정렬하는 문제입니다.
Collection.sort()나Arrays.sort()를 comparator 혹은 람다식을 이용해 확장하여 활용하는 방법
보통 Collection.sort()나 Arrays.sort() 메소드를 사용할 때, 배열이나 리스트를 단순하게 정렬해 왔지만, 이번 문제는 각각의 배열 원소를 개별적으로 비교해야 하므로 조금 복잡했습니다.. (마음이 복잡)
Comparator를 사용하면, 쉽게 해결할 수 있습니다.
우선 2차원 평면이라고 했으니, 2차원 배열을 생각해볼 수 있습니다.
Arrays.sort() 메소드를 확장하여 두번째 파라미터값으로 comparator 익명객체를 생성하여 비교기준을 설정하고 그 기준으로 정렬해줄 수 있습니다.
익명객체는 클래스를 즉석에서 정의하고, 객체를 생성하여 바로 사용하는 방식입니다.
이번 문제에서는 Comparator 인터페이스를 구현하는 익명 클래스를 만들어, compare() 메소드를 통해 int[] 두 개의 배열을 비교하는 방식을 사용하면 됩니다.
Comparator의 기본구조는 아래와 같습니다.
public class ClassName implements Comparator<Type> {
// 필수 구현 부분
@Override
public int compare(Type o1, Typ2 o2) {
/*
비교 로직 구현
*/
}
}
여기서 Type 에는 비교할 대상의 타입이 들어갑니다. 2차원 배열을 비교해주어야 하므로,
T= int[] 가 들어가게 됩니다.
Comparator<int[]>
compare에는 비교하려는 두 개의 객체가 파라미터값으로 들어갑니다.
우리는 좌표를 담고 있는 두 개의 int[] 배열을 비교하게 되므로 아래와 같이 정의해주면 됩니다.
public int compare(int[] e1, int[] e2)
아래 사진과 같이 두번째 파라미터에 익명 클래스를 정의하고 객체를 생성해주어 이용해주면 됩니다.
compare()의 리턴값들이 두번째 파라미터로 전달됩니다.
오름차순으로 정렬하는것이기 때문에 빼주는 순서를 그대로 써주면 됩니다.

아래와 같이 람다식으로 써줘도 됩니다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringTokenizer st ;
// x 좌표가 증가하는데, x좌표가 같으면 y가 증가하는 순서로 정렬
int[][] arr = new int[n][2];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
arr[i][0] = Integer.parseInt(st.nextToken());
arr[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] e1, int[] e2) {
if(e1[0] == e2[0]) {
return e1[1] - e2[1];
}
else {
return e1[0] - e2[0];
}
}
});
// 람다식으로 표현해서 써도 됨
Arrays.sort(arr,(e1 ,e2)->{
if(e1[0]==e2[0]){
return e1[1] - e2[1];
}else{
return e1[0] - e2[0];
}
});
StringBuilder sb = new StringBuilder(0);
for(int i=0; i<n; i++){
sb.append(arr[i][0]+" "+ arr[i][1]).append("\n");
}
System.out.println(sb);
}
}