코드 저장소

공부에는 끝이 없다!

JAVA/코딩 테스트

백준 문제 풀이 - 정렬 단계 - 11650번 좌표 정렬하기 (실버 5)

VarcharC2K 2023. 9. 13. 22:11

이번 문제는 1차원 배열이 아닌 2차원의 배열을 오름차순으로 정렬하는 문제이다.

2차원 배열을 정렬하기 위해선 기존 sort()메서드를 바로 사용할 순 없고 약간 다르게 사용해야 했는데 그럼 2차원 배열을 정렬 하는 방법을 알아보자.


Comparator 익명 클래스 구현

2차원 배열에서 Arrays.sort() 메서드를 사용하게 되면,  java.lang.ClassCastException: I cannot be cast to java.lang.Comparable이란 오류가 발생하게 된다. 비교 기준이 정의 되어있지 않기 때문인데, 때문에 Comparator 인터페이스를 구현하여 정렬기준을 추가해 줘야한다.

comparable, comparator 구현에 대해서 잘 정리된 글이 있어 참고하였다.

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

정리하면, 비교할 객체의 타입을 선언하고, java.util 패키지에 포함되어있는 해당 인터페이스를 overide하여 사용하는 것이다. 그러면 선언한 객체의 타입을 변수로 받아 두개를 비교하는 것이 핵심인데, 이렇게 하는 이유는 int와 같은 타입은 단순히 비교 연산자(>,< 등...)을 사용하여 바로 비교할 수 있지만 객체타입에서는 그렇게 안되기 때문에 따로 비교 방법을 정의해주는 것이라고 생각하면 되겠다. 부가적으로 comparable은 자신과 매개 변수를 비교하는 것이고 comparator는 두개의 매개 변수를 비교하는 것이다.

 


그래서 코드는...

내가 구현한 코드는 다음과 같다.

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

class Main{
    public static int n;
    public static int[][] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        arr = new int[n][2];
        StringTokenizer st;

        for (int i = 0; i < n; i++) {
            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[0]-o2[0] : o1[1]-o2[1];
            }
        });

        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                sb.append(arr[i][j]).append(" ");
            }
            sb.append("\n");
        }
        
        System.out.println(sb.toString());
    }
}

우선 int 타입의 2차원 배열을 선언하고 for문을 순회하며 각 입력값을 넣는다.

그 후, sort 메서드에서 comparator 인터페이스를 구현한다(o1 - o2는 오름차순, o2 - o1을 하면 내림차순이 된다.)

출력 시간을 줄이기 위하여 StringBuilder를 사용하여 정렬된 각 값을 append한 후 마지막에 출력하면 정상적으로 처리가 완료된다.


정리...

아직 2차원 배열의 정리가 정확하게 이해가 되지 않아 조금더 정리가 필요할 것 같다.. 특히 람다식이라던지 comparator 인터페이스 구현쪽은 조금 더 살펴보고 비슷한 문제들을 더 풀어보는 것이 좋을것이다.