import java.util.*;
class Solution {
public String solution(String s) {
//답안 문자열 생성
String answer = "";
//문자열 길이와 같은 Character[] 배열 선언
Character[] chars = new Character[s.length()];
for(int i = 0; i < s.length(); i++){
chars[i] = s.charAt(i);
}
Arrays.sort(chars, Comparator.reverseOrder());
StringBuilder sb = new StringBuilder(chars.length);
for(char c : chars){
sb.append(c);
}
answer = sb.toString();
return answer;
}
}
<aside>
💡 자바에서는 문자열을 직접 정렬하는 내장 함수가 없다. 문자열은 불변(immutable) 객체이기 때문에, 문자열의 내용을 직접 변경할 수 없다. 따라서 문자열을 정렬하려면, 먼저 문자열을 가변 객체(예: char[], List<Character> 등)로 변환한 다음 정렬하고, 다시 문자열로 변환해야 한다.
이 코드에서 배열 타입이 **Character**인 이유는 **Comparator.reverseOrder()**를 사용하기 위해서이다. Comparator.reverseOrder() 메서드는 객체를 대상으로 하는데, 기본 타입인 **char**는 객체가 아니기 때문에 **Comparator.reverseOrder()**를 사용할 수 없다.
그러나 래퍼 클래스인 **Character**는 객체이므로 **Comparator.reverseOrder()**를 사용하여 문자를 내림차순으로 정렬할 수 있다.
</aside>
import java.util.stream.Collectors;
import java.util.Comparator;
class Solution {
public String solution(String s) {
return s.chars()
.mapToObj(c -> (char)c)
.sorted(Comparator.reverseOrder())
.map(String::valueOf)
.collect(Collectors.joining());
}
}
따라서 성능이 매우 중요한 경우에는 배열을 사용하는 방식을 선택하고, 코드의 간결성과 가독성이 더 중요한 경우에는 스트림을 사용하는 방식을 선택하는 것이 좋다. 그러나 대부분의 경우 이 두 방식 사이의 성능 차이는 무시할 수 있을 만큼 작다.
이렇게 두 가지 방식에는 각각 장단점이 있으므로, 어떤 방식을 선택할지는 상황에 따라 달라질 수 있다. 예를 들어, 성능 최적화가 필요한 큰 데이터셋을 다루는 경우에는 배열을 사용하는 방식이 더 좋을 수 있고, 코드의 가독성이 더 중요한 경우에는 스트림을 사용하는 방식이 더 좋을 수 있다.