정렬

프로그래머스 레벨2의 가장 큰 수에서 comparator 를 처음 써보았다.

처음 보는거라 그런지 comparator 라는걸 이해하는게 힘들었다. 문제들을 더 풀어보면서 익숙해지는 수 밖에 없을듯.

문제 자체는 이 comparator 를 사용하는법만 알면 풀리긴 했다.

 

Comparator

/** Arrays.sort(arr, (o1, o2) -> o1.compareTo(o2))
 *  arr 는 String 배열
 *  o1, o2 는 String 값
 *  o1, o2 에 대하여 o1 > o2 이면 o1, o2 순서를 바꾼다.
 *  o1, o2 에 대하여 o1 = o2 이면 그대로.
 *  o1, o2 에 대하여 o1 < o2 이면 그대로.
 */
Arrays.sort(arr, (o1, o2) -> o1.compareTo(o2))   // 오름차순
Arrays.sort(arr, (o1, o2) -> o2.compareTo(o1))   // 내림차순

위와 같이 stream 으로 compare 을 오버라이드 할 수도 있나보다.

 

풀이

  1. int 배열을 String 배열로 바꾼다.
  2. comparator 를 이용하여 Arrays.sort() 메서드로 조건에 맞춰 정렬한다. (숫자 조합 시 큰 경우가 되도록)
  3. 예외 조건을 추가한다. (String 배열에서 0번째 수가 0인 경우는 배열 원소 모두 "0" 인 경우이므로 "0"을 반환)

최종 코드

import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        String[] arr = new String[numbers.length];
        StringBuilder answer = new StringBuilder();
        
        // int 배열을 String 배열로 변환
        for (int i = 0; i < numbers.length; i++) {
            arr[i] = String.valueOf(numbers[i]);
        }
        
        // Comparator를 이용
        Arrays.sort(arr, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
        
        // 예외 조건 추가
        if (arr[0].equals("0")) {
            return "0";
        }
        
        // 예외 조건이 아닐 시 정렬된 배열을 순서대로 합친 문자열을 반환
        for (String a : arr) {
            answer.append(a);
        }
        return answer.toString();
    }
}

+ Recent posts