오늘은 간만에 자바 코테 공부!
Leetcode 179번 https://leetcode.com/problems/largest-number/description/
Given a list of non-negative integers nums, arrange them such that they form the largest number and return it.
Since the result may be very large, so you need to return a string instead of an integer.
- 입력
nums = [3,30,34,5,9]- 출력
"9534330"
각 숫자를 문자열로 변환해서 처리하기 위해 숫자 배열을 문자열 배열로 바꾼다. String.valueOf() 메서드를 활용한다.
해당 문자열 배열을 비교함수를 새로 구현해서 정렬한다. 이 부분은 처음에는 Comparator를 이용해 compare 함수를 새로 정의해서 풀었지만, 리팩토링 단계에서 람다로 바꿔쓰면 편하게 쓸 수 있을 것 같아서 수정했다.
// 1. Comparator 활용
Arrays.sort(arr, new Comparator<String>() {
public int compare(String a, String b) {
String order1 = a + b;
String order2 = b + a;
return order2.compareTo(order1);
}
});
// 2. 람다 활용
Arrays.sort(arr, (a, b) -> {
String order1 = a + b;
String order2 = b + a;
return order2.compareTo(order1);
});
// 3. 람다 + compare 활용
Arrays.sort(arr, (a, b) -> (b + a).compareTo(a + b));
0만 들어있는 배열의 결과는 0이 되어야하므로 조건문을 하나 넣어둔다.
StringBuilder를 이용해 문자열 배열을 이어 붙여서 결과를 반환하면 완료!
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public String largestNumber(int[] nums) {
String[] arr = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
arr[i] = String.valueOf(nums[i]);
}
Arrays.sort(arr, (a, b) -> (b + a).compareTo(a + b));
if (arr[0].equals("0")) {
return "0";
}
StringBuilder sb = new StringBuilder();
for (String s : arr) {
sb.append(s);
}
return sb.toString();
}
}