2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
예시 -
5
3 4
1 1
1 -1
2 2
3 3
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
예시 -
1 -1
1 1
2 2
3 3
3 4
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[][] arr = new int[num][2];
for( int i = 0 ; i < num ; i++ ) {
arr[i][0] = sc.nextInt();
arr[i][1] = sc.nextInt();
}
arr = sort(arr);
for( int i = 0 ; i < num ; i++ ) {
System.out.println(arr[i][0] + " " + arr[i][1]);
}
}
static int[][] sort(int[][] arr){
Arrays.sort(arr, new Comparator<int[]> () {
public int compare(int[] o1, int[] o2) {
if(o1[0] == o2[0]) return Integer.compare(o1[1], o2[1]);
return Integer.compare(o1[0], o2[0]);
}
});
return arr;
}
}
나는 Comparator를 새로 생성해서 사용하는 방식 (첫번째 방식) 을 활용했다.
(참고블로그 : https://cornswrold.tistory.com/203 )
compare함수의 알고리즘은 다음과 같다.
arr[][]에서 각 인자를 비교할 때는 arr[]단위로 비교가 된다.
arr1[0] 과 arr2[0] 같을 때, 즉 x좌표가 같을 때에는 arr1[1]과 arr2[1]끼리 비교한 값을 리턴한다.
그렇지 않을 경우는 x값 즉 arr[0]값 끼리 비교한 값을 리턴한다.
Integer.compare(a, b)의 리턴값 :
a>b : 1
a==b : 0
a<b : -1
위의 코드에서 구현한 compare함수와 다음코드는 같은 알고리즘을 의미한다.
//위에서 구현한 Integer.compare함수를 활용한 코드
if(o1[0] == o2[0]) return Integer.compare(o1[1], o2[1]);
return Integer.compare(o1[0], o2[0]);
//Integer.compare함수를 활용하지 않은 직관적인 코드
if(o1[0] > o2[0]) return 1;
if(o2[0] > o1[0]) return -1;
if(o1[1] > o2[1]) return 1;
if(o2[1] > o1[1]) return -1;
return 0;