3 분 소요


🎯 정렬 정리

// 숫자 배열 정렬
Arrays.sort(arr, (a, b) -> a[0] - b[0]);


// 문자열 배열 정렬
Arrays.sort(arr, (a, b) -> a[0].compareTo(b[0])); // 문자열 기준


// 복합 조건
Arrays.sort(arr, (a, b) -> {
    if (a[0] == b[0]) return a[1] - b[1]; // 1차 기준
    return a[0] - b[0]; // 2차 기준
});


숫자 배열 정렬

Arrays.sort(arr, (a, b) -> a[0] - b[0]);
// 문자열 배열이면: Arrays.sort(arr, (a, b) -> Integer.parseInt(a[0]) - Integer.parseInt(b[0]));
  • a → 정렬 대상 배열의 어떤 한 행 (예: {"21", "Junkyu"})
  • b → 다른 한 행 (예: {"20", "Dohyun"})
  • 숫자는 뺄셈으로 비교 가능


문자열 배열 정렬

a[0], b[0]문자열이라서 - 연산 불가하므로, compareTo 를 써야 한다.

  • a[0].compareTo(b[0]) = 사전순 오름차순
  • b[1].compareTo(a[1]) = 사전순 내림차순
Arrays.sort(arr, (a, b) -> a[0].compareTo(b[0])); // 문자열 기준


복합 조건

Arrays.sort(arr, (a, b) -> {
    if (a[0] == b[0]) return a[1] - b[1]; // 1차 기준
    return a[0] - b[0]; // 2차 기준
});


Comparator 정렬 규칙

Comparator의 반환값은 부호로 순서가 결정된다.

  • 음수 : a가 앞
  • 0 : 같음
  • 양수 : b가 앞
// 오름차순 정렬
(a, b) -> a[0] - b[0] // 작은 값이 앞으로, 큰 값이 뒤로


// 내림차순 정렬
(a, b) -> b[0] - a[0] // 큰 값이 앞으로, 작은 값이 뒤로

ComparatorString.compareTo 모두 내부적으로 유니코드 값을 기준으로 비교해서 음수·0·양수로 결과를 주고, 그 부호를 그대로 쓰면 오름차순, 부호를 뒤집으면 내림차순 정렬이 되는 것이다.


compareTo 메서드

자바에서 문자열이나 숫자 객체(String, Integer 등)를 사전순 정렬 기준으로 비교해주는 메서드

  • 음수 : a가 앞
  • 0 : 같음
  • 양수 : b가 앞
String a = "Banana";
String b = "Apple";
System.out.println(a.compareTo(b)); // 1 (양수)

Comparator 규칙에 따라 Apple 이 앞, Banana 뒤로 정렬됨



백준 정렬 문제

10814번 - 나이순 정렬

📎 https://www.acmicpc.net/problem/10814


나이를 기준으로 오름차순 정렬

Arrays.sort(arr, (a, b) -> Integer.parseInt(a[0]) - Integer.parseInt(b[0]));


11650번 - 좌표 정렬하기

📎 https://www.acmicpc.net/problem/11650


x좌표가 같으면 y좌표 오름차순 정렬

Arrays.sort(arr, (a, b)->{
    if(a[0] == b[0]) return a[1] - b[1];
    return a[0] - b[0];
});


1181번 - 단어 정렬

📎 https://www.acmicpc.net/problem/1181


  1. 길이가 짧은 것부터 (오름차순)
  2. 길이가 같으면 사전 순으로
  3. 중복된 단어는 하나만 남기고 제거 -> set 사용
    • set을 사용하므로 list로 변환 후 정렬해야함
        List<String > list = new ArrayList<>(set);

        Collections.sort(list, (a, b)->{
           if(a.length() == b.length()) return a.compareTo(b); // 사전순
           return a.length() - b.length(); // 길이 짧은 순
        });


26265번 - 멘토와 멘티

📎 https://www.acmicpc.net/problem/26265


  1. 멘토 같으면 멘티 사전 역순 정렬
  2. 아니면 멘토 사전순 정렬
Arrays.sort(arr, (a, b) -> {
    // 멘토 같으면 멘티 사전 역순 정렬
    if (a[0].equals(b[0])) return b[1].compareTo(a[1]);
    // 아니면 멘토 사전순 정렬
    return a[0].compareTo(b[0]);
});


23056번 - 참가자 명단

📎 https://www.acmicpc.net/problem/23056

studentComparator 만들어 복합 정렬 구현

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        List<Student> students = new ArrayList<>();

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()); // 학급수
        int m = Integer.parseInt(st.nextToken()); // 신청 가능 인원수

        int [] arr = new int[n+1];
        while(true){
            st = new StringTokenizer(br.readLine());
            int grade = Integer.parseInt(st.nextToken());
            String name = st.nextToken();

            if(grade == 0) break;

            if (arr[grade] < m) {
                students.add(new Student(grade, name));
                arr[grade]++;
            }
        }

        Collections.sort(students, (a, b) -> {
            // 1. 청팀(1, 홀수)가 백팀(0, 짝수) 보다 먼저오도록 정렬 -> 내림차순 정렬
            int team1 = a.grade % 2;
            int team2 = b.grade % 2;
            if (team1 != team2) return team2 - team1;

            // 2. 학급 오름차순
            if (a.grade != b.grade) return a.grade - b.grade;

            // 3. 길이 같으면 사전순, 다르면 짧은것부터
            if (a.name.length() == b.name.length()) return a.name.compareTo(b.name);
            else return a.name.length() - b.name.length();
        });


        for (Student student : students) {
            System.out.println(student.grade + " " + student.name);
        }

    }

    static class Student{
        int grade;
        String name;

        Student(int grade, String name){
            this.grade = grade;
            this.name = name;
        }

    }
}


카테고리:

업데이트:

댓글남기기