2차원 배열 정렬

a·2026년 1월 14일

자료구조

목록 보기
5/5

✅ 2차원 배열 정렬(int[][])


1️⃣ 첫 번째 열 기준 오름차순 (가장 기본)

Arrays.sort(arr, Comparator.comparingInt(a -> a[0]));

2️⃣ 첫 번째 열 기준 내림차순

Arrays.sort(arr, Comparator.comparingInt((int[] a) -> a[0]).reversed());

3️⃣ 여러 열 기준 (우선순위 정렬)

(1) 1열 오름 → 2열 오름

Arrays.sort(arr,
    Comparator.comparingInt((int[] a) -> a[0])
              .thenComparingInt(a -> a[1])
);

(2) 1열 오름 → 2열 내림

Arrays.sort(arr,
    Comparator.comparingInt((int[] a) -> a[0])
              .thenComparingInt(a -> -a[1]) // 값 범위 작을 때만
);

// 안전 버전
Arrays.sort(arr,
    Comparator.comparingInt((int[] a) -> a[0])
              .thenComparing((a, b) -> Integer.compare(b[1], a[1]))
);

4️⃣ 특정 열 기준 (k번째 열)

int k = 2; // 0-based index

Arrays.sort(arr, Comparator.comparingInt(a -> a[k]));

5️⃣ 행 길이가 다를 수도 있을 때 (jagged array)

Arrays.sort(arr, (a, b) -> {
    int lenCmp = Integer.compare(a.length, b.length);
    if (lenCmp != 0) return lenCmp;
    return Integer.compare(a[0], b[0]);
});

6️⃣ 완전 커스텀 정렬 (조건 분기)

Arrays.sort(arr, (a, b) -> {
    // 1순위: a[0] 오름
    int c = Integer.compare(a[0], b[0]);
    if (c != 0) return c;

    // 2순위: a[1] 내림
    c = Integer.compare(b[1], a[1]);
    if (c != 0) return c;

    // 3순위: a[2] 오름
    return Integer.compare(a[2], b[2]);
});

7️⃣ “행 전체”를 키처럼 비교 (문자열화 ❌)

❌ 이렇게 하지 말 것:

Arrays.sort(arr, (a, b) -> Arrays.toString(a).compareTo(Arrays.toString(b)));

느리고 의미도 애매함.


8️⃣ 자주 쓰는 실전 예제

(1) 전깃줄 문제 (BOJ 2565)

Arrays.sort(wires, Comparator.comparingInt(a -> a[0]));

(2) 회의실 배정

Arrays.sort(meetings,
    Comparator.comparingInt((int[] a) -> a[1]) // 종료 시간
              .thenComparingInt(a -> a[0])     // 시작 시간
);

(3) 좌표 정렬 (x → y)

Arrays.sort(points,
    Comparator.comparingInt((int[] a) -> a[0])
              .thenComparingInt(a -> a[1])
);

9️⃣ 내림차순 + 우선순위 큐까지 같이 쓰는 패턴

PriorityQueue<int[]> pq =
    new PriorityQueue<>((a, b) -> {
        int c = Integer.compare(b[0], a[0]); // 1열 내림
        if (c != 0) return c;
        return Integer.compare(a[1], b[1]);  // 2열 오름
    });

🔑 핵심 규칙 (이거만 기억해도 됨)

  1. a - b 금지
  2. Comparator.comparingInt 우선 사용
  3. 다중 조건은 thenComparingInt
  4. 내림차순은 reversed() 또는 Integer.compare(b, a)
  5. 2차배열 정렬은 행을 하나의 객체처럼 본다

⭐ 최소 암기 세 줄

Arrays.sort(arr, Comparator.comparingInt(a -> a[0]));
Arrays.sort(arr, Comparator.comparingInt((int[] a) -> a[0]).thenComparingInt(a -> a[1]));
Arrays.sort(arr, Comparator.comparingInt((int[] a) -> a[k]));

0개의 댓글