문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
입출력 예

나의 풀이
1. 우선 ,주어진 numbers배열을 차례로 받아서 문자열로 변환했다
2. 문자열로 반환한 numbers배열을 List에 저장하여 내림차순으로 정렬하였다.
이 때, 예를들어
30과 3이 있다고 가정하면, 내림차순으로 정렬할 때,30-3이렇게 된다. 하지만이 둘을 이어붙였을 때 큰 수는 3-30으로 정렬될 때이므로테스트 케이스를 통과하지 못했다.
3. 문제의 제한 조건에서numbers의 원소는 최대 1000이므로. 주어진 원소를3번 연속 이어붙여 비교하였다. 3번 이어붙인 이유는원소의 크기가 최대 1000이므로 만약 원소가한자리 수일 때를 가정해서 조건을 준 것이다. 그러면자연스럽게 재정의한 compare함수 내에서세자리수까지 비교가 되므로,내가 원하는 대로 정렬할 수 있다.
예를 들면, 30과 3을 비교할 때
303030과333을 비교한다. 그러면3이 앞에 오게되어 나의 의도대로 정렬할 수 있었다.
길이가 2이상인 numbers의 모든 원소가 '0'이라면, 마지막의 return값은 00000..... 처럼 0이 무수히 많이 나오는 케이스가 되므로 통과하지 못한다. 그러므로 마지막에 정렬한 List의 첫 번째 원소가 0이라면 그냥 answer = "0"을 return해줌으로써, 예외처리를 해주었다.import java.util.*;
import java.lang.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
int sum = 0;
ArrayList<String> list = new ArrayList<>();
for(int i=0;i<numbers.length;i++){
list.add(Integer.toString(numbers[i]));
}
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
return (s2+s2+s2).compareTo(s1+s1+s1);
}
});
for(int i=0;i<list.size();i++){
answer = answer + list.get(i);
}
if(answer.charAt(0)=='0'){
answer = 0 + "";
}
return answer;
}
}