💡 문제
💬 입출력 예시
📌 풀이(소스코드)
import java.util.*;
class Solution {
public String solution(int[] numbers) {
int length = numbers.length;
String[] strings = new String[length];
for (int i = 0; i < length; i++) {
strings[i] = String.valueOf(numbers[i]);
}
Arrays.sort(strings, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
if (strings[0].equals("0")) {
return "0";
}
StringBuilder answer = new StringBuilder();
for (String string : strings) {
answer.append(string);
}
return answer.toString();
}
}
📄 해설
접근
- 첫번째 접근은 순열을 사용한 접근이었으나, 데이터가 최대 10만개여서 폐기하였다. 이후 접근을 못해서 블로그를 참고했다.
출처: https://bellog.tistory.com/170
- 숫자들의 앞자리 수가 큰 수가 먼저 와야 가장 큰 수를 만들 수 있으므로, 이를 기준으로 내림차순으로 숫자를 정렬해야한다.
- 비교하는 숫자를 앞, 뒤 번갈아가며 이어붙인 것을 기준으로 비교한다는 접근을 해야한다.
과정
- 숫자를 문자열로 변환한 배열을 하나 생성하고, 초기화한다.
- 앞서 말한대로, 두 숫자를 앞, 뒤 번걸아가며 이어붙인 것을 기준으로 정렬을 수행한다.
- 맨 앞 숫자가 0 이면 0을 반환하고, 그렇지 않다면 정렬된 숫자를 이어붙여서 반환한다.
- 이때, 효율을 위해
String
대신 StringBuilder
를 사용하여 생성해주자.
- 변경이 잦은 문자열을 핸들링 할 때는
String
보다 StringBuilder
나 StringBuffer
가 더 효율적이다. 모른다면 찾아보길 바란다.