반응형
-내 생각
단계별 풀어보기에 정렬 카테고리로 분류되어있는 11650번 좌표 정렬하기 문제이다. 문제 자체의 이해는 어렵지 않고 기준에 따라 정렬해야 하기 때문에 Comparator 인터페이스를 오버 라이딩 후 재정의해 풀어야겠다고 생각했다.
-해법
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n= sc.nextInt();
int arr[][]=new int[n][2]; //x좌표 y좌표
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
arr[i][j] = sc.nextInt();
}
}
Arrays.sort(arr,new Comparator<int[]>() { //Comparator 인터페이스 재정의
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0]==o2[0])// x좌표의 값이 같다면 y좌표를 기준으로 정렬
return Integer.compare(o1[1], o2[1]);
return Integer.compare(o1[0], o2[0]); // 나머지는 x좌표를 기준으로 정렬
}
});
for(int i=0;i<arr.length;i++) {
System.out.println(arr[i][0]+" "+arr[i][1]);
}
}
}
이 문제 역시 재풀이를 했으며, Comparator 인터페이스에 대한 사용법이 익숙하지 않다 아직도.
Arrays.sort(arr,new Comparator<int[]>() { //Comparator 인터페이스 재정의
// 여기서 int[] 는 2차원 배열에서 하나의 행을 기준으로 비교한다는 의미이다.
@Override
public int compare(int[] o1, int[] o2) { // 따라서 여기서 o1,o2는 최초 1번째 행과 0번째 행을 의미하며 행단위로 비교된다.
// o1이라고 첫 번째 행을 의미하는 것이 아니다. o1은 다음에 있는 행을 의미, o2는 기준이 되는 행을 의미한다.
if(o1[0]==o2[0])// x좌표의 값이 같다면 y좌표를 기준으로 정렬
return Integer.compare(o1[1], o2[1]); // o1이 다음 행이므로 다음행의 y좌표가 기준 o2행의 y좌표보다 작으면 -1이 리턴되므로 두 행의 위치를 바꾸게 된다.
return Integer.compare(o1[0], o2[0]); // 나머지는 x좌표를 기준으로 정렬
// 마찬가지로 o1이 다음 행이므로 다음행의 x좌표가 기준 o2행의 x좌표보다 작으면 -1이 리턴되므로 두 행의 위치를 바꾼다.
}
});
위의 개념으로 각각의 변수가 무엇을 의미하며, 리턴 값에 따라 어떻게 정렬이 이루어지는 지에 대해 반복적으로 숙달해야 할 것 같다.
반응형