반응형

백준 11650번 좌표 정렬하기 https://www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

 

arr[0][0]과 arr[1][0]의 값이 같다면 arr[0][1] 값과 arr[1][1] 값을 비교하여 작은 값을 먼저 출력하면 된다.

 

즉, 오름차순 + 오름차순

 


Arrays.sort(arr);

// I cannot be cast to class java.lang.Comparable

 2차원 배열을 이런 식으로 정렬한다면 주석과 같은 오류가 뜬다.

 

1. Comparator로 정렬

for(int i=0; i<N; i++) {
    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    arr[i][0] = Integer.parseInt(st.nextToken());
    arr[i][1] = Integer.parseInt(st.nextToken());
}

Arrays.sort(arr, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[0]==o2[0] ? o1[1]-o2[1] : o1[0]-o2[0];
    }
});

 

2. 람다식 정렬

for(int i=0; i<N; i++) {
    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    arr[i][0] = Integer.parseInt(st.nextToken());
    arr[i][1] = Integer.parseInt(st.nextToken());
}

Arrays.sort(arr, (o1, o2) -> { return o1[0]==o2[0] ? o1[1]-o2[1] : o1[0]-o2[0]; });

람다식이 훨씬 간결한 코드로 작성된다.

 

* o1, o2의 타입이 int로 같으므로 타입을 작성하지 않아도 됨.

 


🔍간단하게 더 알아보기

 

1. Comparable  VS Comparator 

 

Comparable -  this.val 와 o.val를 비교 (자기 자신과 매개변수를 비교), compareTo 메소드 필요

Comparator - 두 매개변수를 비교

 

나의 가상 스승님이신 블로거님의 정리. 흐릿해지면 정독해

https://st-lab.tistory.com/243

 

2.  Collections.sort() 

Arrays.~~만 쓰지말고 다른 것도 써보자!

 

반응형