0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
String[] arr = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
arr[i] = "" + numbers[i];
}
Arrays.sort(arr, new Comparator<String>() {
public int compare(String o1, String o2) {
return ((o2 + o1).compareTo(o1 + o2));
}
});
if(arr[0].equals("0")) {
return "0";
}
for (String a : arr) {
answer += a;
}
return answer;
}
}
처음에 문제를 보고 와 이렇게 간단한 문제가 LV2라고? 라는 오만한 생각을 했다.
하지만 이 생각은 진짜 오만했다.
예제에 있는 것 처럼 3,30, 38, 302 가 있다면 숫자의 크기가 아니라 숫자 자릿수의 크기대로 정렬을 해야한다는 것이었다!
각 자릿수대로 ArrayList에 넣어서 비교를 한다던가, 2차원 배열에 넣어서 비교한다던가 여러가지 삽질을 해봤는데 결국 안됐다.
그래서 구글링을 진행한 결과 Comparator 이라는 인터페이스를 새롭게 알게됐다.
Comparator은 두개의 값을 비교해서 정렬값을 내가 원하는 대로 정렬할 수 있게 해주는 것이다.
해당 인터페이스를 구현하는 클래스는 compratorTo(Object o) 메소드를 오버라이드 해야하고, 이 메소드는 객체 자신을 인수를 받은 객체와 비교한다.
위 문제에서 활용한 것은
정수형태의 문자열 2개를 연결 했을 때 더 큰 숫자를 먼저 정렬하도록 하는 것이다.
예를 들어 3, 34 일때 “34”+”3” = “343” 이 “3”+”34”=”334” 보다 크기 때문에 결과적으로 정렬값이 34, 3 으로 정렬된다.
이 것을 잘 활용하면 앞으로 문제 풀 때 더 수월하게 풀 수 있을 것 같다!!