190107 정렬 (2) 가장 큰 수

2019-01-07

정렬 (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;
    }
}
  • 람다식으로 비교식을 만드는 방법을 확실하게 외워둘 것.