오늘은 문자열을 내림차순으로 정렬하는 문제를 해결하는 과정에서 겪은 시행착오와 최적의 해결 방법을 정리해보았다.
문자열 s가 주어졌을 때, 문자를 큰 것부터 작은 순서로 정렬하여 새로운 문자열을 반환하는 함수를 작성하라.
s는 영문 대소문자로만 구성되며, 대문자는 소문자보다 작은 것으로 간주한다. s의 길이는 1 이상이다. 🔹 입출력 예시
입력 (s) | 출력 (return) |
|---|---|
"Zbcdefg" | "gfedcbZ" |
Arrays.sort()를 이용한 정렬 시도 → 실패가장 먼저 떠올린 방법은 Arrays.sort()를 이용하여 정렬하는 것이었다.
하지만 Arrays.sort()는 배열을 정렬하는 메서드이므로, 문자열을 정렬하려면 먼저 배열로 변환해야 한다.
그러나 Java에서 String은 char 배열로 직접 변환할 수 없고, String[]으로 변환해야 한다고 착각하여 막혔다.
(→ 사실 toCharArray()를 사용하면 쉽게 char[] 배열로 변환 가능)
다음으로 String을 String[]으로 변환한 후, for문을 사용해 문자 하나하나를 배열에 넣고 정렬하는 방법을 생각했다.
String s = "Zbcdefg";
String[] arr = new String[s.length()];
for (int i = 0; i < s.length(); i++) {
arr[i] = String.valueOf(s.charAt(i));
}
Arrays.sort(arr, Comparator.reverseOrder());
하지만 이 방법은
String 객체를 생성해야 하고, Java에서는 char 타입이 기본 자료형(primitive type)이므로, Character[] 대신 char[]을 사용해야 성능이 더 좋다.
따라서 이 방법은 적절하지 않다고 판단하고 다른 방법을 찾았다.
Arrays.sort()를 사용할 때 내림차순 정렬을 위해 Comparator.reverseOrder()를 사용하려 했지만,
Arrays.sort()는 char[] 배열에서는 Comparator를 지원하지 않음을 알게 되었다.
(Java의 char는 기본 자료형이므로 Comparator를 사용할 수 없음)
char[] arr = s.toCharArray();
Arrays.sort(arr, Comparator.reverseOrder()); // 오류 발생!
이 문제를 해결하기 위해
1. char[]을 Character[]로 변환 후 정렬
2. 정렬 후 StringBuilder.reverse() 활용
두 가지 방법을 고민했고, 최종적으로 StringBuilder.reverse()를 활용하는 방법을 선택했다.
toCharArray() + Arrays.sort() + StringBuilder.reverse()import java.util.Arrays;
class Solution {
public String solution(String s) {
char[] arr = s.toCharArray(); // 문자열을 char 배열로 변환
Arrays.sort(arr); // 오름차순 정렬 (대문자 먼저 정렬됨)
return new StringBuilder(new String(arr)).reverse().toString(); // 뒤집어서 반환
}
}
toCharArray() 를 이용해 문자열을 char[] 배열로 변환 Arrays.sort(arr) 를 이용해 오름차순 정렬 A-Z → a-z)StringBuilder.reverse() 를 이용해 배열을 뒤집어 내림차순 정렬된 문자열 생성 | 연산 | 시간 복잡도 |
|---|---|
toCharArray() | O(N) |
Arrays.sort() | O(N log N) |
reverse() | O(N) |
| 총 시간 복잡도 | O(N log N) |
➡ 정렬 알고리즘의 한계 때문에 최적의 복잡도는 O(N log N) 이다.
✔ Arrays.sort()를 사용할 때, 기본 자료형인 char 배열은 Comparator를 사용할 수 없다는 점을 인지했다.
✔ StringBuilder.reverse()를 활용하면 간단하게 내림차순 변환이 가능하다는 것을 배웠다.
✔ Java에서 문자열을 다룰 때는 toCharArray()를 활용하여 char[]로 변환하는 것이 성능적으로 유리하다는 점을 확인했다.