Sorting and Searching - 0607. 좌표 정렬
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
int multi = 100000;
for(int i=0; i<n; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
arr[i] = x*multi + y;
}
Arrays.sort(arr);
for(int i=0; i<n; i++) {
System.out.println(arr[i]/multi + " " + arr[i]%multi);
}
}
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){
Scanner kb = new Scanner(System.in);
int n=kb.nextInt();
ArrayList<Point> arr=new ArrayList<>();
for(int i=0; i<n; i++){
int x=kb.nextInt();
int y=kb.nextInt();
arr.add(new Point(x, y));
}
Collections.sort(arr);
for(Point o : arr) System.out.println(o.x+" "+o.y);
}
}
해당 문제는 Comparable<>
인터페이스를 이용해 풀 수 있다. 나의 풀이에서는 정석이 아닌
일종의 꼼수로 문제를 풀었다. x좌표
에 10만을 곱하고 y좌표
와 더한 후 정렬하여 출력한다.
테스트 케이스의 좌표 영역이 10만보다 커지는 경우 문제가 발생할 것이다.
강의에서는 Point
라는 클래스를 만들어 x좌표
와 y좌표
를 저장할 수 있는 인스턴스 변수를
생성하고 Comparable
인터페이스를 상속받아 compareTo()
메소드를 구현하였다.
comapreTo()
메소드는 인터페이스의 메소드를 재정의 한 것이기 때문에 위에 @Override
어노테이션이 붙은 것을 확인 할 수 있다. 이는 Collections.sort()
정렬에 이용된다.
compareTo()메소드의 리턴값
오름차순 정렬
: return
음수 값내림차순 정렬
: return
양수 값해당 문제에서는 좌표를 오름차순 정렬해야한다. 따라서 comaplreTo()
메소드에는 파라미터로
받은 Point
객체 O
의 x
, y
값과 비교하여 음수를 반환하도록 한다.
@Override
public int compareTo(Point o){
// x 좌표가 같은 경우 y 좌표를 비교한다.
if(this.x==o.x) return this.y-o.y;
// x 좌표가 다른 경우 x 좌표를 비교한다.
else return this.x-o.x;
}