https://school.programmers.co.kr/learn/courses/30/lessons/42746#
설명
이 문제를 처음에 봤을 때, 숫자의 가장 상위에 있는 자릿수를 비교하여 정렬하려고 생각했다.
하지만 이 경우 3, 30, 34처럼 일의 자리 숫자와 십의 자리 숫자가 함게 있는 경우(즉 서로 다른 자릿수를 갖는다면) 이 다음 자릿수를 비교해야 한다.
따라서 이 문제는 숫자를 문자로 바꾸고 사전 정렬해서 풀면 된다.
// 숫자들을 저장하는 String 배열을 만들어, 문자들을 숫자로 바꾸고 저장한다.
String[] num = new String[numbers.length];
for(int i = 0; i < numbers.length; i++) {
num[i] = String.valueOf(numbers[i]);
if(numbers[i] != 0) {
allZero = false;
}
}
// 저장된 배열을 Comparator를 이용해 정렬한다.
Arrays.sort(num, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// 비교하는 숫자들은 순서로 조합해서 확인한다.(6, 10이라면 610 또는 106을 비교)
return (o2 + o1).compareTo(o1 + o2);
}
});
+) 배열에 0만 담길 경우를 고려해야 한다. 0으로만 구성되어 있다면 answer = 0이 되고 종료한다.
코드
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
String[] num = new String[numbers.length];
boolean allZero = true;
for(int i = 0; i < numbers.length; i++) {
num[i] = String.valueOf(numbers[i]);
if(numbers[i] != 0) {
allZero = false;
}
}
Arrays.sort(num, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return (o2 + o1).compareTo(o1 + o2);
}
});
for(String n : num) {
answer += n;
}
if(allZero) {
answer = "0";
}
return answer;
}
}