틀린 첫번째 풀이
Arrays.sort(arr, (a, b) -> {
String sa = String.valueOf(a);
String sb = String.valueOf(b);
return sb.compareTo(sa);
});
처음에 접근한 방식은 배열의 각 숫자들을 문자열로 바꾸고, 내림차순으로 정렬한 뒤 이어붙이는 거였다.
그렇게 되면 각 숫자의 제일 앞에 자리부터 비교하며 큰 수가 제일 앞에 오게 되고, 그대로 이어붙이면 가장 큰 수가 될 것이라고 생각했지만 틀린 접근이었다.
{10, 2, 20, 201} -> {2, 201, 20, 10}
좌측 배열을 위 방식으로 정렬하면 우측의 배열이 된다.
하지만 저렇게 이어붙여 만들어진 22012010보다 {2, 20, 201, 10}을 이어붙인 22020110이 더 큰 수가 된다.
올바른 정렬 방법
두 수를 이어 붙였을 때, a + b, b + a 중에 더 큰 숫자가 되는 순서로 정렬을 해야한다.
Arrays.sort(arr, (a, b) -> {
String ab = a.toString() + b.toString();
String ba = b.toString() + a.toString();
return ba.compareTo(ab);
});
import java.util.*;
class Solution {
public String solution(int[] numbers) {
Integer[] nums = new Integer[numbers.length];
for (int i = 0; i < numbers.length; i++) {
nums[i] = numbers[i];
}
Arrays.sort(nums, (a, b) ->{
String ab = a.toString() + b.toString();
String ba = b.toString() + a.toString();
return ba.compareTo(ab);
});
StringBuilder sb = new StringBuilder();
for (int num : nums) {
sb.append(num);
}
String result = sb.toString();
if (result.charAt(0) == '0') result = "0"; // 만들어진 문자열이 0의 연속일 경우 0 출력 ex) 000000
return result;
}
}