0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
| numbers | result |
|---|---|
| [6, 10, 2] | "6210" |
| [3, 30, 34, 5, 9] | "9534330" |
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, (a, b) -> (b + a).compareTo(a + b));
if (strNumbers[0].equals("0")) return "0";
StringBuilder sb = new StringBuilder();
for (String s : strNumbers) {
sb.append(s);
}
return sb.toString();
}
}
배열 안의 각 숫자의 단순 크기 비교가 아니니까 int 배열을 String 배열로 바꾸었다.
문자열 배열을 내림차순으로 정렬한다.
정렬된 순서대로 이어붙여서 최댓값 문자열을 완성한다.
Comparator
Arrays.sort(strNumbers, Comparator)
strNumbers를 정렬하는데, 내가 직접 정의한 비교 기준(Comparator)으로 정렬한다는 뜻!!
람다식 사용
(a, b) -> (b + a).compareTo(a + b)
두 문자열 a, b를 어떻게 비교할지 지정한다는 뜻.
우리는, 문자열 두 개를 붙여본 다음 (a+b, b+a) 어떤 조합이 더 큰지 비교한다!
a b a+b b+a 누가 앞에 와야 할까? 3 30 330 303 3 34 3 343 334 34 9 5 95 59 9 그리고, 만약 오름차순으로 정렬한다면
(a, b) -> (a + b).compareTo(b + a);
int -> String 변환 두 가지 비교
strNumbers[i] = Integer.toString(numbers[i]); strNumbers[i] = String.valueOf(numbers[i]);✅ 공통점
둘 다 int 값을 문자열(String) 로 변환하는 데 사용, 결과 동일.✅ 차이점
항목 Integer.toString()String.valueOf()내부 동작 int를String으로 직접 변환int면Integer.toString()호출null전달 시 (Object)NPE 발생 (NullPointerException) "null" (문자열) 반환 가독성/의도 표현 숫자를 문자열로 변환하고자 함이 명확함 좀 더 일반적, 다양한 타입 처리에 적합 Integer num = null; String a = String.valueOf(num); // "null" String b = Integer.toString(num); // ❌ NullPointerException 발생✅ 언제 어떤 걸 써야 할까?
숫자(int)를 문자열로 변환하려는 의도가 명확하면 → Integer.toString()
null일 수도 있는 객체나 다양한 타입을 처리할 경우 → String.valueOf()✅ 결론
조금 더 일반적이고 안전한 방식으로는 String.valueOf()가 선호됩니다.