Algorithm - TwoDimensional Array Sorting

  • 2023-12-12 에 풀이한 문제
  • 풀이 시간 : 09:10 ~ 09:30



알고리즘 문제(Java) : 좌표 정렬 ( 2차원 배열 정렬 문제 )


1. 문제

N개의 평면상의 좌표(x, y)가 주어지면 모든 좌표를 오름차순으로 정렬하는 프로그램을 작성하세요.
정렬기준은 먼저 x값의 의해서 정렬하고, x값이 같을 경우 y값에 의해 정렬합니다.



2. 입력

  • 첫째 줄에 좌표의 개수인 N(3<=N<=100,000)이 주어집니다.
  • 두 번째 줄부터 N개의 좌표가 x, y 순으로 주어집니다. x, y값은 양수만 입력됩니다.



3. 출력

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



4. 문제 풀이

  • 2차원 배열 문제를 풀 때에는 Comparator<> 를 활용해서 그 안에 있는 compare 라는 함수를 재정의 해줘야 한다.
  • 아래 코드는 기본적인 코드 예제이다.
// 오름차순
Arrays.sort(arr, new Comparator<int[]>() {
	@Override
	public int compare(int[] o1, int[] o2) {
		if ( o1[0] == o2[0] ) {
			return o21[1]-o2[1];
		} else {
			return o1[0]-o2[0];
		}
	}
});

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


  • 그러나 람다식을 활용하면, 훨씬 간단하게 바꿀 수 있다.
// 오름차순 정렬
Arrays.sort(arr, (o1,o2) -> (o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]));

// 내림차순 정렬
Arrays.sort(arr, (o1,o2) -> (o1[0] == o2[0] ? o2[1] - o1[1] : o2[0] - o1[0]));


  • 이렇게 람다식으로 재정의한 메서드를 활용하여 문제를 풀면, 답안은 아래와 같다.
public class Coordinate_Alignment {

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

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[][] arr = new int[n][2];
        for ( int i=0; i<n; i++ ) {
            arr[i][0] = scan.nextInt();
            arr[i][1] = scan.nextInt();
        }
        for ( int[] x : solution(n, arr) ) {
            System.out.println(x[0] + " " + x[1]);
        }
    }

}




  • 추가로, 문자열 이차원 배열의 정렬은 아래 코드를 사용하면 된다.
Arrays.sort(arr, (o1, o2) -> {
    if (o1[0].equals(o2[0])) {
        return o1[1].compareTo(o2[1]);
    } else {
        return o1[0].compareTo(o2[0]);
    }
});






results matching ""

    No results matching ""