본인의 풀이 방식은 x, y 좌표를 나타내는 Coord 클래스를 생성하고, compareTo 메서드를 오버라이드하여 비교하는 메서드를 작성하였다. 찾아보니 클래스가 아닌 2차원 배열로 x, y 좌표를 저장하는 방법도 있어 이 방법도 함께 소개하려고 한다.
출처:
https://st-lab.tistory.com/110
https://st-lab.tistory.com/111
class 사용한 예시
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 길이
ArrayList<Coord> coordList = new ArrayList<>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
coordList.add(new Coord(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
}
Collections.sort(coordList);
for (int i = 0; i < N; i++) {
System.out.println(coordList.get(i));
}
}
}
class Coord implements Comparable<Coord>{
private int x;
private int y;
Coord(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int compareTo(Coord o) {
// 순서를 바꾼다.
if (o.y > y) {
return -1;
}
// 순서를 바꾼다.
if (o.y == y && o.x > x) {
return -1;
}
// 순서를 바꾸지 않는다.
return 1;
}
@Override
public String toString() {
return x + " " + y;
}
}
2차원 배열을 사용할 수도 있다.
sort 메서드는 제너릭 객체배열(T[]
) 인자를 받을 수 있다. 이는 클래스, 오브젝트, 자료형 등 어떤 타입이든 배열 형태로 받을 수 있다.
int[][]
는 int[]
하나의 타입이고, int[][] 라는 1차원 배열이라고 생각할 수 있다.
Comparator<? super T>c
를 살펴보면, <? super T>
라는 상속관계에 있는 타입만 자료형으로 받는다는 의미이다. T
타입이 자식클래스이고, T
의 상속관계에 있는 타입까지 허용한다. 상속관계에 있는 데이터를 정렬하지 않아 <T>
로만 봐도 된다. 우리는 compare 메서드를 오버라이딩하여 사용자화할 수 있다.
int[][] arr = new int[N][2];
for(int i = 0; i < N; i++){
arr[i][1] = in.nextInt();
arr[i][0] = in.nextInt();
2차원 배열 arr[N][2]배열에서, arr[i][0]
와 arr[i+1][0]
을 정렬하고, 두 값이 같으면 arr[i][1]
과 arr[i+1][1]
을 비교한다.
Arrays.sort(arr, (e1, e2) -> {
// 첫번째 원소가 같다면, 두번째 원소끼리 비교한다.
if(e1[0] == e2[0]){
return e1[1] - e2[1];
} else {
return e1[0] - e2[0];
}
});