Arrays.sort()의 경우 안에 정렬 방식을 넣을 수 있도록 정의되어져 있다.
따라서 Comparator 인터페이스의 public int compare(T o1,T o2) 메소드를 이용해서 Array의 정렬방식을 바꿔보고자 한다.
이 문제는 2차원 배열로 푸는 문제가 아니라 객체를 하나 만들고 그 객체에 x,y값을 넣는 방식으로 구현해보았다.
import java.util.*;
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
int T = Integer.parseInt(br.readLine());
xyDot[] arr = new xyDot[T];
for(int i=0;i<T;i++){
st = new StringTokenizer(br.readLine()," ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
arr[i] = new xyDot(x,y);
}
Comparator<xyDot> comp = new Comparator<xyDot>(){
public int compare(xyDot x1, xyDot x2){
if(x1.y == x2.y) return x1.x -x2.x;
else return x1.y-x2.y;
}
};
Arrays.sort(arr,comp);
for(xyDot index : arr){
bw.write(index.x+" ");
bw.write(index.y+"\n");
}
bw.flush();
bw.close();
br.close();
}
static class xyDot{
int x;
int y;
public xyDot(int x, int y){
this.x =x;
this.y =y;
}
}
}
추가적으로
왜
compare() 메서드에서 x1-x2 면 오름차순이고 x2-x1이면 내림차순일까에 대한 궁금증이 있을 수 있다.
return 값이 양수이면 자리바꿈이 일어나기 때문이다.
원래 x1 x2의 자리라고 생각하면
x1-x2의 결과가 양수이면 자리바꿈이 일어나 x2 x1이 된다. 즉 큰 수인 x1이 뒤로 이동했다.-> 오름차순
x2-x1의 결과가 양수라면 자리바꿈이 일어나서 x2 x1이 된다. 즉 큰 수인 x2가 앞으로 이동했다. -> 내림차순