코딩 테스트를 준비하면서 배열 정렬 문제를 자주 마주쳤습니다. 대부분은 단순히 오름차순, 내림차순으로 정렬하거나 특정 기준을 기반으로 정렬하는 작업이었습니다. 이 과정에서 Java의 Comparator에 대해서 자세히 알아보게 되었습니다.
문제를 만나며 느낀 벽
처음엔 단순히 배열 정렬만 하면 되는 문제였습니다. 하지만 갑자기 등장한 조건부 정렬 문제는 저를 당황스럽게 했습니다.
예: 문자열 배열에서 n번째 문자를 기준으로 정렬하되, 같은 문자가 나오면 사전순으로 정렬하라.
이런 문제를 처음 봤을 때는 솔직히 "이걸 어떻게 정렬하지?"라는 생각이 들었습니다. 하지만 Java의 Arrays.sort와 Comparator를 알게 되면서 문제를 해결할 방법이 생각났습니다.
Comparator로 정렬 기준을 커스터마이징
Java의 Arrays.sort는 기본적으로 배열을 자연 정렬 순서(숫자는 오름차순, 문자열은 사전순)로 정렬합니다. 하지만 Comparator를 사용하면 내가 원하는 기준으로 정렬할 수 있습니다. 문제에서 주어진 조건처럼 n번째 문자를 기준으로 정렬하려면 Comparator가 딱이었습니다.
1. 람다 표현식으로 간결하게 작성
Arrays.sort(strings, (s1, s2) -> {
if (s1.charAt(n) == s2.charAt(n)) {
return s1.compareTo(s2); // 사전순 정렬
}
return s1.charAt(n) - s2.charAt(n); // n번째 문자 비교
});
2. 정렬 기준을 조합할 수 있다
조건부 정렬 문제는 여러 기준을 조합해야 합니다. 제가 풀던 문제는
1. n번째 문자를 기준으로 정렬
2. 만약 문자가 같다면 사전순으로 정렬
이 두가지 조건을 Comparator로 해결할 수 있습니다.
- s1.charAt(n) - s2.charAt(n): 두 문자열의 n번째 문자를 비교
- s1.compareTo(s2): 문자열 전체를 사전순을 비교
3. 내부 동작 이해하기
사실 이걸 이해하는 것이 가장 중요할 듯하다.
1. 배열의 두 원소 s1과 s2를 비교합니다.
2. s1.charAt(n)과 s2.charAt(n)을 아스키 값으로 비교합니다.
- 음수: s1이 앞
- 0: 같으면 다음 기준으로 이동
- 양수: s2가 앞
3. compareTo로 사전 순서를 결정합니다.
4. 내림차순 정렬도 쉽게 구현 가능
만약 문자열 배열을 n번째 문자를 기준으로 내림차순 정렬하려면 다음과 같이 작성할 수 있습니다:
Arrays.sort(strings, (s1, s2) -> {
if (s1.charAt(n) == s2.charAt(n)) {
return s2.compareTo(s1); // 사전 순서 반대로
}
return s2.charAt(n) - s1.charAt(n); // n번째 문자 비교를 반대로
});
'백엔드 > JAVA' 카테고리의 다른 글
[Java] 맵(Map) (0) | 2024.12.04 |
---|---|
[JAVA] Stream API (0) | 2024.12.01 |
[JAVA] 리스트 (0) | 2024.11.27 |
[JAVA] 자료구조와 알고리즘 (0) | 2024.11.26 |