2차원 평면 위의 점 N개가 주어진다. 좌표를 x좌표가 증가하는 순으로, x좌표가 같으면 y좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.
출력
첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.
BOJ11650
한 좌표의 x,y 값을 이차원 배열로 저장하거나, 새로운 객체를 하나 만들어 낸 뒤 객체를 정렬하는 방법을 묻는 문제이다.
해당 문제에서는 x 조건뿐만 아니라 y조건도 고려하여야 하므로, 정렬 기준을 조금 다르게 해야한다. comparator를 사용하는것이 제일 알맞아보였다.
Arrays.sort() 메서드에 추상클래스로 comparator를 만들어 사용했다. x조건 뿐만 아니라 y조건까지 상정해야 하는 것이 포인트였다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(bf.readLine());
Coordi [] co = new Coordi[n];
for(int i = 0; i < n; i++) {
st = new StringTokenizer(bf.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
co[i] = new Coordi(x,y);
}
Arrays.sort(co, new Comparator<Coordi>() {
public int compare(Coordi o1, Coordi o2) {
if(o1.x != o2.x) {
return o1.x - o2.x;
}
else {
return o1.y - o2.y;
}
}
});
for(Coordi c : co) {
System.out.println(c.x + " " + c.y);
}
}
public static class Coordi {
int x;
int y;
public Coordi(int x, int y) {
this.x = x;
this.y = y;
}
}
}