

시간초과 없음
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
//문자열 리턴을 해줄 스트링배열 생성
String[] str = new String[numbers.length];
//int배열 String배열로 변환
for(int i = 0; i < numbers.length; i++){
str[i] = String.valueOf(numbers[i]);
}
//내림차순 정렬
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return (b+a).compareTo(a+b);
//오름차순 정렬 (o1+o2).compareTo(o1+o2);
}
});
//0값이 중복일경우 ex){0,0,0}
//답이 000이 나오면 안되므로 첫번째값이 0이면 0을 리턴
if (str[0].equals("0")) return "0";
//0이 아니면 문자열을 더해준다.
for(String s: str) answer += s;
return answer;
}
}
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return (b+a).compareTo(a+b);
//오름차순 정렬 (o1+o2).compareTo(o1+o2);
}
});
a) (31).compareTo(13) : 양수 -> 3은 1보다 정렬 순서에 앞선다.
b) (21).compareTo(12) : 양수 -> 2는 1보다 정렬 순서에 앞선다.
c) (23).compareTo(32) : 음수 -> 3은 2보다 정렬 순서에 뒤쳐진다.
따라서 정렬 후의 모습은 [3,2,1]이다.
(a+b).compareTo(b+a)는 오름차순 정렬을 의미한다.
정렬 후의 모습은 [1,2,3] 이다.
문자열 간 대소비교는 문자열을 구성하는 각 문자의 유니코드 값(또는 ASCII 값)을 기반으로 수행된다. 문자열 비교는 첫 번째 문자부터 시작하여, 두 문자열 중 하나가 다른 문자열보다 더 작은 문자(유니코드 값이 더 작은 문자)를 가지고 있을 때, 그 문자열이 더 작다고 판단한다. 만약 비교하는 문자가 동일하면, 다음 문자로 넘어가 비교를 계속한다. 이 과정은 두 문자열 중 하나가 끝날 때까지 또는 비교하는 도중 두 문자가 다를 때까지 계속된다.
예를 들어, 문자열 '12'와 '11'을 비교할 때, 첫 번째 문자인 '1'은 두 문자열에서 동일하므로, 비교는 두 번째 문자로 넘어간다. 두 번째 문자에서 '2'는 '1'보다 유니코드 값이 크므로, '12'가 '11'보다 크다고 판단된다. 이러한 방식으로 문자열 간 대소비교가 가능하다.
문자열 비교는 사전 순서를 따르는데, 이는 숫자를 문자열로 변환했을 때의 숫자값의 크기와는 다를 수 있다.
예를 들어, 숫자로는 2 > 11이지만, 문자열로는 "2" < "11"다
(사전 순으로 "11"이 "2"보다 앞선다).