🔙뒤로가기

링크

기본 알고리즘으로 풀기

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>

stream을 이용해서 풀기(java 8 이상)

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());
    }
}

두 방식의 차이

  1. 배열: 전통적인 방식으로, 일반적으로 스트림을 사용하는 방식보다 빠르고 메모리 사용량도 적다. 하지만 코드가 더 길고, 명시적으로 배열을 생성하고 정렬하고 다시 문자열로 변환하는 과정이 필요하므로 코드를 이해하고 작성하는 데 더 많은 시간이 필요할 수 있다.
  2. 스트림: 이 방식은 함수형 프로그래밍 스타일을 사용하므로 코드가 짧고 이해하기 쉽다. 하지만 스트림 연산은 일반적으로 배열 연산보다 느리고, 더 많은 메모리를 사용한다.

결론

따라서 성능이 매우 중요한 경우에는 배열을 사용하는 방식을 선택하고, 코드의 간결성과 가독성이 더 중요한 경우에는 스트림을 사용하는 방식을 선택하는 것이 좋다. 그러나 대부분의 경우 이 두 방식 사이의 성능 차이는 무시할 수 있을 만큼 작다.

이렇게 두 가지 방식에는 각각 장단점이 있으므로, 어떤 방식을 선택할지는 상황에 따라 달라질 수 있다. 예를 들어, 성능 최적화가 필요한 큰 데이터셋을 다루는 경우에는 배열을 사용하는 방식이 더 좋을 수 있고, 코드의 가독성이 더 중요한 경우에는 스트림을 사용하는 방식이 더 좋을 수 있다.