좌표 정렬하기2(11651)

좌표를 다른 순서로 정렬하는 문제

문제

2차원 평면 위의 점 N개가 주어진다. 좌표를 y좌표가 증가하는 순으로, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한 다음 출력하는 프로그램을 작성하시오.

전 문제는 x를 먼저 기준으로 잡고, y를 먼저 기준으로 잡아라

2차원 배열 기준으로 첫 번째 배열기준이냐, 두 번쨰 배열기준이냐

입력

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

출력

첫째 줄부터 N개의 줄에 점을 정렬한 결과를 출력한다.

예제 입력

5
0 4
1 2
1 -1
2 2
3 3

예제 출력

1 -1
1 1
2 2
3 3
3 4

풀이

import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int arr[][] = new int[N][2];

        for(int i=0; i<N; i++){
            arr[i][0] = sc.nextInt();
            arr[i][1] = sc.nextInt();
        }

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

        for(int i=0; i<N; i++){
            System.out.print(arr[i][0]+" ");
            System.out.println(arr[i][1]);
        }

    }
}

여기서 확인할 수 있는게

Comparator의 내부에 있는 compare함수에서 비교하는 과정에서

o1와 o2 배열안의 인자가 비교하는 대상이란 것을 알 수 있었다.

저번 문제 을 봐보면 저번 문제에서는 x축을 기준으로 정렬을 하기 떄문에 o1[0] - o2[0]가 되었고 이번에는 반대로 y축을 기준으로 정렬을 하기 떄문에 o1[1] - o2[1]이 된것을 확인할 수 있다.

즉, 비교하는 대상이 있는 위치를 Comparator의 내부의 compare함수에 넣어주는 것이라고 볼 수 있다.

굳이 개발자가 이걸 어떻게 시간을 줄일 수 있을까 해서 직접 구현하는 것 보다 더 좋음

Comparator를 선언 시, Generic type을 설정해주고 그 타입에 해당하는 정렬을 새로 정의하는 것도 가능하다

파라미터를 int로 가정하면 앞의 값에서 뒤의 값을 뺀다고 했을 때 앞의 값이 더 크다면 그 차이는 양수가 나올 것이고, 작다면 음수가될 것임

Comparator는 기본적으로 오름 차순이기 때문에 그 원리를 적용해서 순서를 변경하고자 한다면 양수를 리턴시키고, 순서를 그대로 놔두고 싶다면 음수를 리턴시키면 되는 일이다.

백준

Last updated

Was this helpful?