0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
numbers의 길이는 1 이상 100,000 이하입니다.
numbers의 원소는 0 이상 1,000 이하입니다.
정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
✳️ 문제풀이
이번 문제는 `정렬` 문제이다. 주의할 사항이 있다면 주어진 정수에 대한 정렬이 아니라 정수를 이어붙여서 문자열의 구성을 이뤘을 때 에 대한 정렬을 해야 한다.
그렇기에 Arrays.sort() 메서드와 커스텀 Comparator 을 사용하여 문자열 배열을 정렬했다. 비교 로직에서는 두 문자열 o1, o2 를 서로 다른 순서로 붙여 비교한다.
예를 들어 o1 = "3", o2 = "30" 인 경우,
o2+o1 = "303"
o1+o2 = "330"
를 비교하여 어느 조합이 더 큰지를 판단했다.
String[] strNumbers = new String[numbers.length];
// 정수 배열을 문자열 배열로 변환
for (int i = 0; i < numbers.length; i++) {
strNumbers[i] = String.valueOf(numbers[i]);
}
// 문자열 비교를 통해 정렬
Arrays.sort(strNumbers, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// 두 문자열을 서로 붙여보며 큰 순서대로 정렬
return (o2 + o1).compareTo(o1 + o2);
}
});
또한 주의할 점이 정렬된 배열의 첫번째 요소가 "0"인 경우, 가장 큰 값이 0임을 의미한다. 이는 모든 숫자가 0이므로 "0"을 반환하는 예외처리를 해줘야 한다.
// 정렬된 배열의 첫 번째 요소가 "0"이면, 모든 숫자가 0이므로 "0"을 반환
if (strNumbers[0].equals("0"))
return "0";
✅ 전체 코드
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String[] strNumbers = new String[numbers.length];
for (int i = 0; i < numbers.length; i++)
strNumbers[i] = String.valueOf(numbers[i]);
Arrays.sort(strNumbers, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// 두 문자열을 서로 붙여보며 큰 순서대로 정렬
return (o2 + o1).compareTo(o1 + o2);
}
});
// 정렬된 배열의 첫 번째 요소가 "0"이면, 모든 숫자가 0이므로 "0"을 반환
if (strNumbers[0].equals("0"))
return "0";
StringBuilder sb = new StringBuilder();
for (String num : strNumbers)
sb.append(num);
return sb.toString();
}
}