ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <스프링 기초 - 자바> 2차원 배열 정렬
    백엔드 : 서버공부/Spring 2024. 5. 23. 12:35
    728x90

    이차원 배열 메소드의 원리에 대해 기록하려고 작성하는 글

     

    자바에서 1차원 배열의 정렬은 아주 간단하다. Arrays.sort메소드를 사용하면 된다. 

    2차원 배열이라는 문제상황에서도 Arrays.sort는 유효할까? 아마 날먹(?)의 마음으로 이차원 배열을 Arrays.sort 인자로 넣으면 아래같은 문제를 맞이했을것이다.

    Arrays.sort(나는 2차원 배열)

     

    ClassCastException 예외가 발생하는 이유는 Arrays.sort 메소드가 2차원 배열을 위한 Comparable 인터페이스를 구현하지 않은 배열을 정렬하려고 하기 때문이다. 

     

    ComparableTimSortComparable을 구현한 객체들을 정렬할 때 사용됩니다. 만약 객체들이 Comparable을 구현하지 않았다면, Comparator를 명시적으로 제공하여 TimSort를 사용하면된다.

     

    해결방법은 따라서 Comparator를 제공하면된다. Arrays.sort 메소드는 TimSort를 사용하기때문에 TimSort가 사용하는 Comparator를 제공하면 된다.

     

    아래는 2차원 배열을 정렬하기 위한 예시 코드이다.

    import java.util.Arrays;
    import java.util.Comparator;
    
    public class Main {
        public static void main(String[] args) {
            int[][] points = {
                {3, 4},
                {2, 3},
                {3, 2},
                {1, 5}
            };
    
            // 배열 정렬
            Arrays.sort(points, new Comparator<int[]>() {
                @Override
                public int compare(int[] point1, int[] point2) {
                    // 첫 번째 요소(x 좌표) 비교
                    int xCompare = Integer.compare(point1[0], point2[0]);
                    // 첫 번째 요소가 같으면 두 번째 요소(y 좌표) 비교
                    if (xCompare == 0) {
                        return Integer.compare(point1[1], point2[1]);
                    }
                    return xCompare;
                }
            });
    
            // 정렬 결과 출력
            for (int[] point : points) {
                System.out.println(Arrays.toString(point));
            }
        }
    }

     

    위 코드를 통해 2차원 배열은 첫 번째 요소, 두번째 요소를 기준으로 정렬되게 된다.

     

    그치만 코드만 보면 이해가 안가는 부분이 있다. 2차원 배열 points를 인자로 받았는데 구현부분에서는 points가 어떻게 사용되는지 도무지 보이지가 않는다. 

     

    그래서 Arrays.sort 메소드를 분해해보기로 했다.
    Arrays.sort 는 내부적으로 정렬 알고리즘을 사용한다. 정렬 과정에서 Comparatorcompare 메소드를 호출한다.

    오버라이드 부분에서는 보이지않지만 이차원배열은

    `Arrays.sort(points, new Comparator<int[]>()...` 부분에서 2차원 배열의 요소는 compare 메소드로 전달이된다.
    전달이되면 compare메소드 내부의 배열 분할 및 비교를 하는 부분이 구현되어있어 2차원 배열의 각 행이 1차원배열로 간주되어 비교된다.

    먼저 오버라이드에서 구현한 부분을 보자.

    int xCompare = Integer.compare(point1[0], point2[0]);


    이 부분은 2차원 배열중 각 행의 첫 번째요소 끼리 비교하는 구현 부분이다. 이 부분의 속을 들여다 보면 아래와 같이 작동하고 있다.

    // 첫 번째 비교: {"3", "4"}와 {"2", "3"} 비교
    int result = comparator.compare(new int[]{"3", "4"}, new int[]{"2", "3"});

     

    그래서 아래와같이 코드를 작성하면 2차원배열의 각행중 첫번째요소를 기준으로 정렬이라는 기능을 구현할 수 있는 것이다.

    int xCompare = Integer.compare(point1[0], point2[0]);



    이차원 배열을 정렬할 때 Arrays.sort메소드는 각 행을 1차원 배열로 간주한뒤 compare메소드를 통해 1차원 배열을 비교하여 정렬하는 것이었다..!!!




Designed by Tistory.