프로그래머스의 가장 큰 수 문제다.
이전에 작성한 파이썬 풀이와 동일한 문제다.
이전에 문제 해설을 찾아볼 때 파이썬 뿐 아니라 자바 풀이도 본 적이 있어 이를 기반으로 풀어보았다.
파이썬에서는 문자열을 비교하는 방법을 지정할 수 없어서 문자열을 여러 번 이어붙이고 비교했지만 자바에서는 대부분의 정렬 메서드에서 Comparator 구현체를 받아 정렬 방법을 사용자가 직접 명시할 수 있다.
그래서 풀이에서는 Arrays 클래스의 sort 메서드에 파라미터로 두 수를 앞뒤로 조합한 후 비교하는 Comparator 구현체를 넘겨서 활용할 수 있었다.
이를 기반으로 작성한 코드는 다음과 같다.
import java.util.*;
class Solution {
public String solution(int[] numbers) {
// https://stackoverflow.com/questions/880581/how-to-convert-int-to-integer-in-java
// Comparator에서 int를 비교하기 위해 int 배열을 Integer 배열로 변환.
Integer[] numbersBoxed = Arrays.stream(numbers).boxed().toArray(Integer[]::new);
// 구현된 Comparator를 이용한 Integer 배열 정렬.
Arrays.<Integer>sort(numbersBoxed, new Comparator<Integer>() {
@Override
public int compare(Integer value1, Integer value2) {
// "정수 1 + 정수 2" 조합과 "정수 2 + 정수 1" 조합을 비교.
return Integer.valueOf(String.format("%d%d", value2, value1)).
compareTo(Integer.valueOf(String.format("%d%d", value1, value2)));
}
});
// 정렬된 정수들을 하나의 문자열로 병합.
StringBuilder builder = new StringBuilder();
for(int number: numbersBoxed) {
builder.append(number);
}
String output = builder.toString();
// 모든 정수가 0인 경우 "0000"처럼 병합되기 때문에 예외처리.
return output.charAt(0) == '0' ? "0" : output;
}
}
코딩 테스트는 항상 파이썬이 간편하고 더 이해하기 쉽다는 착각에 빠져 있던 나를 정신차리게 해준 문제였다. 생각하기도 힘든 풀이의 파이썬보다 이렇게 Comparator로 정렬 방식을 커스텀하는 것이 더 이해하기도 쉽고 직관적이었다.
물론 파이썬으로도 어떤 간편한 풀이나 정렬 방식을 지정할 수 있는 방법이 있다고 생각하지만 현재 수준에서는 자바 풀이가 더 맘에 든다.