AngelPlayer`s Diary

자바에서 2차원 배열을 정렬하는 기준은 크게 4가지라고 볼 수 있습니다.

 

1. 2차원 배열의 1 번째 요소를 기준으로 오름차순 정렬

2. 2차원 배열의 1 번째 요소를 기준으로 내림차순 정렬

3. 2차원 배열의 0 번째 요소를 기준으로 오름차순 정렬

4. 2차원 배열의 0 번째 요소를 기준으로 내림차순 정렬

 

정렬을 하는 방법은 여러가지가 있을 수 있지만 람다를 사용한 정렬 방식이 그나마 가장 쉽게 이해하고 사용할 수 있는 코드라고 생각됩니다.

 

 

오름차순/내림차순이 헷갈리신다면,

 

오름차순 : 1에서 시작 -> 999로 올라감

내림차순 : 999에서 시작 -> 1로 내려감

 

으로 생각하시면 됩니다.

 

 

// 정렬할 2차원 배열
int[][] angel = { {-5, -3}, {5, 7}, {5, 10}, {2, 8} };

위와 같은 2차원 배열이 존재한다고 가정해봅시다.

 

먼저 1번째 요소를 이용하여 정렬을 해보겠습니다.

 

 

 

1번째 요소를 기준으로 오름차순 정렬

// angel[1]을 기준으로 정렬
Arrays.sort(angel, (o1, o2) -> {
    return o1[1] - o2[1]; // 오름차순 정렬
});

앞에서 말씀드렸듯이 오름차순은 가장 작은 값이 가장 먼저 나타나야 합니다.

 

정렬은 Arrays의 sort()를 사용하며, 람다식을 통해서 구현하게 됩니다.

 

o1, o2는 sort 함수들(compareTo)에서 암묵적으로 사용하는 변수로 다른 이름으로 변경하셔도 무방합니다.

 

sort()의 결과로 "첫 번째 요소(o1) - 두 번째 요소(o2)"를 반환하면 오름차순을 구현한 것이 됩니다.

 

[-5, -3] [5, 7] [2, 8] [5, 10]

구현된 오름차순의 결과는 앞서 말씀드린 것과 같이 1번째 요소가 작은 것에서 큰 순서대로 출력됩니다.

(-3 -> 7 -> 8 -> 10)

 

 

 

1번째 요소를 기준으로 내림차순 정렬

// angel[1]을 기준으로 정렬
Arrays.sort(angel, (o1, o2) -> {
    return o2[1] - o1[1]; // 내림차순 정렬
});

1번째 요소를 기준으로 내림차순 정렬은 오름차순 정렬에서 리턴에 들어가는 변수들의 위치만 바꿔주면 됩니다.

 

 

 

 

0번째 요소를 기준으로 오름차순 정렬

// angel[0]을 기준으로 정렬
Arrays.sort(angel, (o1, o2) -> {
    return o1[0] - o2[0]; // 오름차순 정렬
});

0번째 요소를 기준으로 오름차순 정렬도 위에 코드를 이해하셨다면 쉽게 해결할 수 있을 것입니다.

 

 

 

다만 이번 예시에서 [5, 7]과 [5, 10]이 동일한 숫자로 시작하기 때문에 어떤 값이 먼저 나올지가 모호한 현상이 발생합니다. 

 

현재 코드에서는 입력한 순서대로 출력되기 떄문에 위 이미지와 같이 나오지만,

 

만약 입력 순서가 {-5, -3}, {5, 10}, {5, 7}, {2, 8} 였다면 [5, 10]이 먼저 출력되고 이후 [5, 7]이 출력될 것입니다.

 

 

Arrays.sort(angel, (o1, o2) -> {
    // angel[0]이 동일하면
    if (o1[0] == o2[0]) {
        // angel[1] 기준으로 비교
        return o2[1] - o1[1]; // 내림차순
    }
    return o1[0] - o2[0]; // 오름차순 정렬
});

따라서 위와 같은 문제가 발생하는 경우 if문을 추가하여 조건을 제시한다면 쉽게 해결할 수 있습니다.

 

 

 

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band