[정렬] 7. 좌표 정렬
<<풀이>>
이 문제를 접근할 때, 클래스를 생각을 했었다. 그렇게 해서 배열이나 클래스에 넣어서 정렬을 하려고 했는데, 일반적인 배열에서는 즉, 기본 타입 일때는 Arrays.sort를 활용해서 정렬을 했다면 객체 형태는 어떻게 할지 의문이 들었다. 비록 하더라도 엄청 복잡할 것 같았다.
강사님의 풀이를 보고 이런 방법도 있구나 했다 ㅋㅋ
-강사님 풀이-
import java.util.*;
class Point implements Comparable<Point> {
public int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int compareTo(Point o) {
if(this.x == o.x) return this.y - o.y;
else return this.x - o.x;
}
}
class Main{
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
ArrayList<Point> arr = new ArrayList<>();
for(int i = 0; i < n; i++) {
int x = in.nextInt();
int y = in.nextInt();
arr.add(new Point(x,y));
}
Collections.sort(arr);
for(Point x : arr) System.out.println(x.x + " " + x.y);
}
}
Comparable<T> 라는 인터페이스를 활용하는 것이었다. 이것을 이용해서 추상메서드인 comepareTo를 재정의 하여 구하는 것이다.
재정의 할 때 오름차순 형태를 원한다면 왼쪽에는 현재 클래스 값을 넣고 오른 쪽에는 비교 대상을 넣는 것이다. 반대로 내림 차순을 할 때에는 왼쪽에 비교대상을 오른쪽에 현재 클래스의 값을 넣는다. 이렇게 하고 Collection.sort에 이 객체들을 담은 ArrayList를 넣으면 list가 정렬이 된다. 이러한 개념이 있다는 것을 오늘 처음 알았고 아직 제대로 모르겠다 ㅋㅋ 그래서 따로 공부를 해야할 것 같다
<<추가 공부>>
Comparable 인터페이스란?
comparable 인터페이스는 객체간의 비교를 가능하게 해주는 인터페이스이다. 해당 인터페이스를 구현(implements)한 클래스는 반드시 compareTo<T o> 메소드를 재정의해야 한다.
@Override
public int compareTo(Point o) {
if(this.x == o.x) return this.y - o.y;
else return this.x - o.x;
}
*기본적으로 wrapper 클래스는 이를 가지고 있다.
이 메서드의 리턴값을 가지고 Collection.sort()를 통해 list 안에 있는 객체를 정렬할 수 있다.
*Arrays.sort() 같은 경우는 배열을 정렬한다. 따라서 배열안에 객체를 넣어서 Arrays.sort()해도 정렬이 된다.
import java.util.*;
class Point implements Comparable<Point> {
public int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int compareTo(Point o) {
if(this.x == o.x) return this.y - o.y;
else return this.x - o.x;
}
}
class Main{
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
Point[] arr = new Point[n];
for(int i = 0; i < n; i++) {
int x = in.nextInt();
int y = in.nextInt();
arr[i] = new Point(x, y);
}
Arrays.sort(arr);
for(Point x : arr) System.out.println(x.x + " " + x.y);
}
}
정리하자면 Collection.sort는 리스트를 정렬 Arrays.sort는 배열을 정렬한다. 그리고 wrapper 클래스는 일반적으로
Comparable<T> 를 implements 하고 있고 만약 새로은 클래스를 정려하기 위해서는 Comparable<T>를 implements 하고
comparTo를 재정의 해줘야 한다.
오늘도 배워간다~~