[Java] 2차원 배열 정렬

WS·2022년 9월 26일
0

Algorithm

목록 보기
6/8

1차원 배열은 간단하게 Arrays.sort를 사용하면 가능하지만 2차원 배열은 compare 함수를 override를 해야지만 가능합니다.

1.Override를 통한 정렬

다음과 같은 수가 input으로 주어지고, 첫번째 원소를 기준으로 정렬하되, 첫번 째 원소의 값이 같을 시 두번쨰 원소를 오름차순으로 정렬하는 코드를 예로 들어보겠습니다.


input

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

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

public class Algorithm {

    public static void main(String[] args)throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[][] arr = new int[6][2];
        for(int i =0 ; i < 6; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }
        // (배열, override 함수);
        Arrays.sort(arr, new Comparator<int[]>() { // new Comparator 함수 Override
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[0] == o2[0]){ // 첫번째 원소의 값이 같을 때 두번쨰 원소의 값을 기준으로 정렬
                    return o1[1] - o2[1];
                }else{ // 같지 않을 시 첫번째 원소를 기준으로 정렬
                    return o1[0] - o2[0];
                }
            }
        });
        
        for(int i = 0; i < 6; i++){ // 출력문
            System.out.println(arr[i][0] + ", "+arr[i][1]);
        }

    }
}

다음과 같이 sort함수 안에 배열과, override할 함수를 선언을 하면 compare함수를 자동완성 시켜줍니다. 그 후 o1과 o2의 값을 비교하여 오름차순을할지, 내림차순을 할지 결정합니다.
오름차순 : o1 - o2;
내림차순 : o2 - o1;
여기서 o1과 o2는 다음의 사진을 보면 이해가 금방됩니다.

o1, o2는 행으로 생각하고 행에서의 첫번쨰 원소와 두번째 원소를 비교하여 정렬을 합니다.


2.Lambda식을 통한 정렬

java에서 lambda식을 이용하여 한줄로도 2차원 배열 정렬이 가능합니다.

Arrays.sort(arr, (o1,o2) -> (o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]));
// Arryas.sort(2차원 배열, (o1,o2) -> ( 조건문 ? true 일때 정렬순서 : false일때 정렬순서));

Override를 통해 하는 정렬과 방식은 같은데 삼항연산자를 이용하여 간단하게 위의 코드와 같이 람다식으로 정렬이 가능합니다.

0개의 댓글