190107 정렬 (2) 가장 큰 수
정렬 (2) 가장 큰 수
문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.
제한 사항
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
풀이 과정
- 처음엔 단순히 numbers 배열을 문자열로 변환 후 정렬해서 붙였다.
- 하지만 [3, 30 , 34]를 연결하는 경우, 위의 방식으로 연결하면 34303이 나온다.(34330이 올바른 답)
- 따라서 문자열 비교 조건을 새로 만들어야 한다.
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
int len=numbers.length;
String[] numberStr=new String[len];
for(int i=0;i<len;i++)
numberStr[i]=Integer.toString(numbers[i]);
Arrays.sort(numberStr, (s1,s2)->(s2+s1).compareTo(s1+s2));
// 문자열을 연결하였을 때 더 큰 값이 나오는 경우로 정렬!
for(int i=0;i<len;i++)
answer+=numberStr[i];
if(answer.indexOf("0")==0)
answer="0";
// numbers의 원소가 0만 있는 경우 처리.
return answer;
}
}
- 람다식으로 비교식을 만드는 방법을 확실하게 외워둘 것.