정렬
프로그래머스 레벨2의 가장 큰 수에서 comparator 를 처음 써보았다.
처음 보는거라 그런지 comparator 라는걸 이해하는게 힘들었다. 문제들을 더 풀어보면서 익숙해지는 수 밖에 없을듯.
문제 자체는 이 comparator 를 사용하는법만 알면 풀리긴 했다.
Comparator
/** Arrays.sort(arr, (o1, o2) -> o1.compareTo(o2))
* arr 는 String 배열
* o1, o2 는 String 값
* o1, o2 에 대하여 o1 > o2 이면 o1, o2 순서를 바꾼다.
* o1, o2 에 대하여 o1 = o2 이면 그대로.
* o1, o2 에 대하여 o1 < o2 이면 그대로.
*/
Arrays.sort(arr, (o1, o2) -> o1.compareTo(o2)) // 오름차순
Arrays.sort(arr, (o1, o2) -> o2.compareTo(o1)) // 내림차순
위와 같이 stream 으로 compare 을 오버라이드 할 수도 있나보다.
풀이
- int 배열을 String 배열로 바꾼다.
- comparator 를 이용하여 Arrays.sort() 메서드로 조건에 맞춰 정렬한다. (숫자 조합 시 큰 경우가 되도록)
- 예외 조건을 추가한다. (String 배열에서 0번째 수가 0인 경우는 배열 원소 모두 "0" 인 경우이므로 "0"을 반환)
최종 코드
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String[] arr = new String[numbers.length];
StringBuilder answer = new StringBuilder();
// int 배열을 String 배열로 변환
for (int i = 0; i < numbers.length; i++) {
arr[i] = String.valueOf(numbers[i]);
}
// Comparator를 이용
Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
// 예외 조건 추가
if (arr[0].equals("0")) {
return "0";
}
// 예외 조건이 아닐 시 정렬된 배열을 순서대로 합친 문자열을 반환
for (String a : arr) {
answer.append(a);
}
return answer.toString();
}
}