[알고리즘] 정렬 - 가장 큰 수

Jang Seok Woo·2022년 1월 2일
0

알고리즘

목록 보기
9/74

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항

numbers의 길이는 1 이상 100,000 이하입니다.
numbers의 원소는 0 이상 1,000 이하입니다.
정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예

numbersreturn
[6, 10, 2]"6210"
[3, 30, 34, 5, 9]"9534330"

고려해야할 점

  • return이 String이다.
  • String으로 숫자를 붙이며 비교해 정렬을 해야한다는 사실을 머릿속으로 떠올려야한다. - 쉽지 않음
  • 비교함에 있어 Comparator를 이용하면 편리하다.
  • 0이 2개 이상 있을 경우, "00"이 리턴될 수 있으니 "0"으로 따로 지정해 준다.

나의 정답 제출 코드

    public static String solution(int[] numbers) {
        String answer = "";

        String[] temp = new String[numbers.length];

        for(int i=0;i<numbers.length;i++) {
            temp[i] = String.valueOf(numbers[i]);
        }

        Arrays.sort(temp, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2+o1).compareTo(o1+o2);
            }
        });

        if(temp[0].equals("0")) return "0";

        return String.join("", temp);
    }

우선 comparator를 사용하는 것이 익숙해야한다.
주의해야할 점은,

return (o2+o1).compareTo(o1+o2);

이 부분에서, 앞에선 o2 + o1 인데, 뒤는 o1 + o2라는 사실.
String을 더하는 것이라 서로 값이 완전히 다른 값이다.

예외처리도 생각해내기 쉽지 않다.

if(temp[0].equals("0")) return "0";

[0,0] 과 같은 배열이 주어질 경우

더하게 되면 "00"이 되기 때문에 해당 값은 "0"으로 리턴해주기 위해 예외처리를 해준다.

profile
https://github.com/jsw4215

0개의 댓글