Post

[99클럽 코테 스터디 4일차 TIL] 내 입맛대로 정렬하기, Array.sort()와 Comparator

99클럽 썸네일

문제

프로그래머스 - 가장 큰 수 문제를 보고 풀이한 내용이다.

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

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

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

제한 사항

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

풀이

내림차순 정렬?

Arrays.sort를 사용하면 자바에서 손쉽게 오름차순, 내림차순으로 정렬을 할 수 있었다. 이번 문제는 배열을 이어붙여 가장 큰 수를 찾는 문제였기 때문에 단순히 생각하면 내림차순 정렬을 통해 해결 할 수 있을 것처럼 보였으나..

입력 예제

[3, 30, 34, 5, 9]를 내림차순으로 정렬하면 [9, 5, 34, 30, 3]이 되는데, 이는 정답인 [9, 5, 34, 3, 30]보다 작은 수가 된다.

따라서 내림차순이 아니라 두 요소를 더했을 때 더 큰 수가 되는 쪽을 내림차순으로 정렬하는 새로운 정렬 기준을 만들어주어야 했다.

입맛대로 정렬하기

Comparator 익명 객체 사용

객체를 내가 원하는 대로 정렬하기 위해서는 Arrays.sort() 메서드에 정렬하기를 원하는 배열과 Comparator 객체를 인자로 넘겨주면 된다.

Ararys.sort()

이제 Comparator 객체의 compare() 메서드를 Override 해서 원하는 정렬 기준을 구현해주면 원하는 대로 정렬을 사용할 수 있다.

1
2
3
4
5
6
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2 + o1).compareTo(o1 + o2);
            }
        });

Java 8 이상부터 가능한 Lambda 사용

Java 8 이상부터는 Lambda를 사용해 익명 객체의 구현 없이 더 간결하게 표현해줄 수 있다.

1
Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));

결과 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public String solution(int[] numbers) {
        String[] arr = new String[numbers.length];

        // numbers 배열을 String 배열로 만든다
        for (int i = 0; i < arr.length; i++) {
            arr[i] = String.valueOf(numbers[i]);
        }

        // String 배열을 Comparator를 이용해 정렬한다
        // o1과 o2를 더한 값과 o2와 o1을 더한 값을 비교해 더 큰 쪽을 내림차순으로 정렬한다
        Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));

        // 만약 첫 수가 0이면 가장 큰 수는 0
        if (arr[0].equals("0")) {
            return "0";
        }

        StringBuilder answer = new StringBuilder();

        for (int i = 0; i < arr.length; i++) {
            answer.append(arr[i]);
        }

        return answer.toString();
    }

채점 결과

done!

This post is licensed under CC BY 4.0 by the author.