본문 바로가기
알고리즘 문제풀이 입문: 코딩테스트 대비/섹션 6. Sorting, Searching(정렬, 이분검색과 결정)

좌표 정렬 (compareTo)

by _비니_ 2024. 4. 20.

설명

N개의 평면상의 좌표(x, y)가 주어지면 모든 좌표를 오름차순으로 정렬하는 프로그램을 작성하세요.

정렬기준은 먼저 x값의 의해서 정렬하고, x값이 같을 경우 y값에 의해 정렬합니다.

 

입력

첫째 줄에 좌표의 개수인 N(3<=N<=100,000)이 주어집니다.

두 번째 줄부터 N개의 좌표가 x, y 순으로 주어집니다. x, y값은 양수만 입력됩니다.

 

출력

N개의 좌표를 정렬하여 출력하세요.

 

예시 입력 1 

5
2 7
1 3
1 2
2 5
3 6

 

예시 출력 1

1 2
1 3
2 5
2 7
3 6

 

 

문제 해결

 

x좌표를 기준으로 정렬을 하되, x좌표가 같으면 y좌표를 기준으로 정렬이 되는 문제이다.

(x,y) 2개의 열로 정해져 있고, 좌표의 총 개수는 N개로 입력 받아지므로 2차원 배열은 int[N][2] 로 만들어주면 된다.

 

Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[][] arr = new int[N][2];

 

 

x좌표를 기준으로 정렬을 하되, x좌표가 같으면 y좌표를 기준으로 정렬이되므로 i번째의 x좌표 / i번째의 y좌표를 각각 저장하기 위해 아래와 같이 입력받아 저장해준다.

 

for(int i = 0; i < N; i++) {
    arr[i][0] = in.nextInt();  // x
    arr[i][1] = in.nextInt();  // y
}

 

 

비교를 하기 위해 구글링을 하다가 Comparator를 사용하는 방법을 사용하기로 했다.

람다 표현식 (a, b) -> {...}은 Comparator의 compare 메서드를 구현 => 두 개의 인수를 받아 비교 결과를 반환

 

먼저 x좌표를 기준으로 정렬을 한다고 했으므로  x좌표가 서로 다를 경우, 오름차순으로 정렬하도록 구현한다.

a[0] != b[0] ( x좌표가 서로 다를 경우) a[0] - b[0]를 반환한다.

else 아닌 경우, 즉 x좌표가 같은 경우에는 y좌표를 기준으로 정렬이 되어야 하므로 1번째 인덱스로 비교해준다.

그리고 a[1] - b[1]를 반환해준다.

이 반환된 값들은 Arrays.sort() 메서드가 Comparator를 사용하여 배열을 정렬한다.

 

 

개인적으로 좀 어려웠당... 다 까먹은 개념이라서 어렵게 다가온 거 같은데 알고 있었다면 문제 푸는데 유용했을 거 같당

 

 

최종 코드

 

import java.util.Arrays;
import java.util.Scanner;

public class P07_좌표정렬 {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int[][] arr = new int[N][2];

        for(int i = 0; i < N; i++) {
            arr[i][0] = in.nextInt();  // x
            arr[i][1] = in.nextInt();  // y
        }

        Arrays.sort(arr, (a, b) -> {
            if (a[0] != b[0]) {
                return a[0] - b[0];
            } else {                   // x 좌표가 같으면 y 좌표에 따라 정렬
                return a[1] - b[1];
            }
        });

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

    }
}
반응형