정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꿔서 출력해라.
처음에는 그냥 단순히 ArrayList로 재배치해서 가장 마지막 순서부터 출력하려고 했다.
근데 두 자릿수 정수부터는 이게 안 먹힌다...
ex) {5, 30}이면 큰 수는 = 530 내가 원하는 방식대로 출력하면 350
그래서 다른 방식으로 접근해봤다.
Comparable 의 compareTo를 사용했는데 자세한 컨 코드를 보면서!
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
//numbers의 길이와 같은 크기의 String 배열 선언
String[] num = new String[numbers.length];
//String 배열에 numbers의 인자 넣어줌
for(int i = 0; i < num.length; i++){
num[i] = String.valueOf(numbers[i]);
}
//n1 + n2와 n2 + n1을 비교해서 더 큰 수 반환
Arrays.sort(num, (n1,n2) -> (n2 + n1).compareTo(n1 + n2));
for(int i = 0; i < num.length; i++) {
answer+=num[i];
}
return answer;
}
}
✔️Comparable 의 compareTo
Arrays.sort로 정렬을 할 때, compareTo로 n1 + n2랑 n2 + n1을 비교
예시
numbers = [3, 30, 34, 5, 9] 라면
해당 int 배열을 String 배열로 바꿨기 때문에
n1 + n2 = 330 > n2 + n1 = 303 -> 그대로 유지
n1 + n2 3034 < n2 + n1 = 3430 -> 순서 바꿔서 return
이런 방식이 되는 것이다.
이렇게 했는데 자꾸 마지막 제출에서 오류가 났다.
배열에 모두 0이 들어가있을 경우에 대한 수를 계산하지 못한 것.
import java.util.*;
class Solution {
public String solution(int[] numbers) {
StringBuffer answer = new StringBuffer();
//numbers의 길이와 같은 크기의 String 배열 선언
String[] num = new String[numbers.length];
//String 배열에 numbers의 인자 넣어줌
for(int i = 0; i < num.length; i++){
num[i] = String.valueOf(numbers[i]);
}
//n1 + n2와 n2 + n1을 비교해서 더 큰 수 반환
Arrays.sort(num, (n1,n2) -> (n2 + n1).compareTo(n1 + n2));
for(int i = 0; i < num.length; i++) {
answer.append(num[i]);
}
if(num[0].equals("0")) {
return "0";
} else {
return answer.toString();
}
}
}
마지막에 배열에 0만 포함되어있는 경우, 0만 출력할 수 있게 추가해줬다.
성공!