개발일기/CS(면접)

Comparator를 활용한 문자열 정렬: 오름차순, 내림차순, 길이순 정렬까지

w.llama 2025. 2. 2. 01:22

코딩 테스트에서 정렬 문제를 자주 접하게 됩니다. 평소에는 Arrays.sort() 이나 Collections.sort()를 활용하여 정렬 문제를 해결하지만, 특정한 정렬 기준(예: 길이순, 내림차순, 복합 정렬 등)을 적용하려면 기본 정렬 방식만으로는 한계가 있다.

 

이때 Comparator를 활용하면 보다 유연하게 정렬 기준을 적용할 수 있습니다. Comparator를 이용하여 다양한 방식으로 문자열 배열을 정렬하는 방법을 정리해 보려고 한다.

기본적인 문자열 배열 정렬

 Arrays.sort()를 활용한 사전순(오름차순)

import java.util.Arrays;

public class StringSortExample {
    public static void main(String[] args) {
        String[] words = {"banana", "apple", "cherry", "date"};
        
        Arrays.sort(words);
        System.out.println(Arrays.toString(words));
    }
}
  • Arrays.sort(words)를 사용하면 기본적으로 사전순(알파벳순) 정렬이 적용됨.
  • 하지만 특정한 기준(예: 길이순, 내림차순)으로 정렬하려면 Comparator를 활용해야 된다.

Comparator를 활용한 정렬

문자열 내림차순 정렬

사전순이 아닌 내림차순(반대로 정렬) 하고 싶다면 Comparator.reverseOrder()를 사용하면 된다.

import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        String[] words = {"banana", "apple", "cherry", "date"};

        Arrays.sort(words, Comparator.reverseOrder()); // 내림차순 정렬
        
        System.out.println(Arrays.toString(words));
    }
}

문자 길이순 정렬

문자열을 길이순으로 정렬하려면 Comparator.comparingInt(String::length)을 사용할 수 있다.

import java.util.Arrays;
import java.util.Comparator;

public class StringLengthSort {
    public static void main(String[] args) {
        String[] words = {"banana", "apple", "cherry", "date"};
        
        Arrays.sort(words, Comparator.comparingInt(String::length));
        System.out.println(Arrays.toString(words));
    }
}

문자열 길이 기준 내림차순 정렬

길이를 기준으로 내림차순 정렬하고 싶다면 .reversed()를 활용하면 된다.

Arrays.sort(words, Comparator.comparingInt(String::length).reversed());

복합 정렬 (길이순 정렬 + 알파벳순 정렬)

문자열 길이가 같을 경우 알파벳순(사전순) 정렬을 추가하고 싶다면 .thenComparing(Comparator.naturalOrder())을 활용하면 된다.

Arrays.sort(words, Comparator.comparingInt(String::length)
                             .thenComparing(Comparator.naturalOrder()));

Comparator 를 직접 구현하기

만약 특정한 기준으로 복잡한 정렬을 해야한다면 Comparator 인터페이스를 직접 구현해도 된다.

import java.util.Arrays;
import java.util.Comparator;

class CustomComparator implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        // 문자열 길이가 긴 순서대로 정렬, 길이가 같다면 알파벳 역순 정렬
        if (s1.length() != s2.length()) {
            return s2.length() - s1.length(); // 길이 기준 내림차순
        }
        return s2.compareTo(s1); // 알파벳 역순
    }
}

public class Main {
    public static void main(String[] args) {
        String[] words = {"banana", "apple", "cherry", "date"};

        Arrays.sort(words, new CustomComparator());

        System.out.println(Arrays.toString(words));
    }
}

혹은 익명 클래스를 활용해

import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        String[] words = {"banana", "apple", "cherry", "date"};

        Arrays.sort(words, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                // 문자열 길이가 긴 순서대로 정렬, 길이가 같다면 알파벳 역순 정렬
                if (s1.length() != s2.length()) {
                    return s2.length() - s1.length(); // 길이 기준 내림차순
                }
                return s2.compareTo(s1); // 알파벳 역순
            }
        });

        System.out.println(Arrays.toString(words));
    }
}

이렇게 되면 코드 구조가 더 간결하고, 불필요한 클래스 선언 없이 직접 Comparator를 정의할 수 있다.

정리

정렬방식 코드
기본 정렬 (사전순 정렬) Arrays.sort(words)
내림차순 정렬 Arrays.sort(words, Comparator.reverseOrder())
문자열 길이 기준 정렬 Arrays.sort(words, Comparator.comparingInt(String::length))
문자열 길이 기준 + 내림차 Arrays.sort(words, Comparator.comparingInt(String::length).reversed())
길이 기준 정렬 후, 길이가 같으면
알파벳순 정렬
Arrays.sort(words, Comparator.comparingInt(String::length)
                  .thenComparing(Comparator.naturalOrder()))

체인방식으로 붙이면 됨

'개발일기 > CS(면접)' 카테고리의 다른 글

Fegin Client??  (0) 2025.03.23
아키텍쳐 종류 그리고 특징  (0) 2025.02.24
브루트 포스 (Brute Force) 알고리즘이란?  (0) 2025.01.24
StringTokenizer 와 split과 차이점  (0) 2024.12.26
Scanner 차이 BufferedReader  (0) 2024.12.18