첫번째 시도 후 실패 소스
public static String solution(int[] numbers) {
String answer = "";
String [] temp = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
temp[i] = Integer.toString(numbers[i]);
}
Arrays.sort(temp);
String s = "";
for (int j = temp.length; j > 0; j--) {
s += temp[j-1];
}
//System.out.println(s);
answer = s;
return answer;
}
문자열 정렬하면 맨 앞의 숫자 기준으로 정렬되니까 차례로 큰수가 조합돼서 원하는 결과를 출력할 수 있지 않을까.. 했는데
int [] numbers2 = {3, 30, 34, 5, 9};
이 케이스에서 9534330 이 나와야하는데 9534303 이 나와버렸다
여러 헛발질과 다른 사람들의 풀이 참고 끝에 통과했다
sort 메소드 안에서 사용되는 compare 메소드를 오버라이딩 하여 문자열을 비교하여 정렬하는 방식이었다
compareTo 에는 숫자형 비교, 문자열 비교가 가능한데 여기선 문자열의 크기를 따져야하므로 문자열 비교!
숫자형 비교와 문자열 비교의 리턴값이 다른데 숫자형 비교에서는 동일한 값이면 0, 기준값이 비교대상보다 작으면 -1, 크면 1을 반환한다.
아래는 소스와 참고 함수들
public static String solution(int[] numbers) {
String answer = "";
String [] temp = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
temp[i] = Integer.toString(numbers[i]);
}
// 정렬
Arrays.sort(temp, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
System.out.println((o2 + o1) + " " + (o1 + o2));
return ((o2 + o1).compareTo(o1 + o2));
}
});
if(temp[0].equals("0")) {
return "0";
}
for (String a : temp) {
answer += a;
}
return answer;
}
int compareTo(String anotherString)
기준값과 비교대상의 값을 비교하여 0 또는 그 외의 양수나 음수를 반환
- 문자열이 같은 경우 0 리턴
ex) ab.compareTo(ab) = 0
- 비교대상이 문자열에 포함되어 있는 경우 길이의 차 리턴
ex) abcd.compareTo(ab) = 2
- 다른 문자열의 경우 아스키코드 값의 차 리턴
ex) abcd.compareTo(zyxvw) = -25
고뇌의 흔적 추가