Welcome! Everything is fine.

[프로그래머스 고득점 Kit Lv.2] 정렬 - 가장 큰 수(Java) (+ Comparator 정리) 본문

프로그래머스/알고리즘 고득점 Kit

[프로그래머스 고득점 Kit Lv.2] 정렬 - 가장 큰 수(Java) (+ Comparator 정리)

개발곰발 2024. 3. 11.
728x90

📌 문제

📌 코드

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        StringBuilder answer = new StringBuilder();
        String[] strArr = new String[numbers.length];
        
        for (int i = 0; i < numbers.length; i++) {
            strArr[i] = String.valueOf(numbers[i]); // numbers의 요소를 String으로 바꿔 새 배열에 추가
        }
        
        Arrays.sort(strArr, new Comparator<String>() { // 정렬 기준을 정의한 객체인 Comparator를 이용해 정렬
            public int compare(String a, String b) {
                return (b+a).compareTo(a+b);
            }
        });
        
        if (strArr[0].equals("0")) return "0"; // [0, 0, 0] 일 때 “000”이 아닌 “0”이 반환되도록 하기
        
        for (String s : strArr) {
            answer.append(s);
        }
        
        return answer.toString();
    }
}

📌 풀이

  •  그냥 내림차순 정렬을 했을 때는 두 번째 테스트 케이스가 통과되지 않았다. 이때 Comparator를 Arrays.sort의 두번째 파라미터에 넣어 정렬 기준을 정의함으로 두 수의 조합 중 더 큰 수를 알아낼 수 있다.
  • compareTo를 이용해 리턴된 결과를 출력문으로 찍어보니 다음과 같은 결과가 나왔다. 610과 106을 비교하면 610이 더 커서 6이 더 크다고(앞에 와야 한다고) 판단하는 것이다. 또 자세히 보니 리턴되는 값은 각 문자의 아스키 코드를 뺀 결과값이었다.

  • Comparator에 대해 이것저것 찾아보니 많은 사람들이 아래와 같은 코드를 거의 공식처럼 사용하고 있었다.
    • 오름차순 : (a+b).compareTo(b+a)
    • 내림차순 : (b+a).compareTo(a+b)
  • 주로 Comparator와 헷갈리는 것이 Comparable인데 둘 다 인터페이스인 점은 같지만 Comparator는 두 매개변수 객체를 비교하며 compare 메서드를 구현해야 하고, Comparable은 자기 자신과 매개변수 객체를 비교하며 compareTo 메서드를 구현해야 한다. 
  • 문자열을 더하는 연산이 많을 때는 StringBuilder를 사용하면 시간과 메모리를 줄일 수 있다.

StringBuilder 사용 전(왼)과  StringBuilder 사용 후(오)