[프로그래머스] 가장 큰 수 - Java

이지연·2025년 12월 14일
post-thumbnail

문제 접근

  1. 숫자 배열을 문자열 배열로 변환 (String.valueOf()).
  2. 특별 비교자 (b+a).compareTo(a+b)내림차순 정렬:
    • A+B vs B+A 비교 → 더 큰 문자열이 앞에 오도록
  3. StringBuilder로 정렬된 문자열들을 앞에서부터 결합.
  4. 선행 0 제거 (replaceFirst("^0+", "")).
  5. 빈 배열 처리 (isEmpty() 체크 → "0" 반환).

즉, "문자열 변환 → 특별정렬 → 결합 → 후처리" 완벽 흐름!


특별 비교자 (b+a).compareTo(a+b) 사용 이유

숫자 비교 X : "34" > "30" → 잘못된 순서
문자열 붙이기 비교 O : "34"+"30"="3430" > "30"+"34"="3034"

핵심 원리: 정렬의 추이법칙 활용

A > B, B > C → A > C (전체 순서 자동 도출)
O(N log N)으로 N! 순열 탐색 대체!

주요 메서드:

  • String.valueOf(): 숫자→문자열
  • Arrays.sort(comparator): 특별 비교 정렬
  • replaceFirst("^0+", ""): 선행 0 제거

시뮬레이션 예시

이 때 문자열 붙이기까지 작성한 코드를 제출 시, 테스트11에서 실패를 하였는데, 0이 선행되는 경우 전부 제거해주고, 빈 배열 처리를 해줘야하기 때문에 각각의 처리를 이행해야함(제출 코드 내 ✅ 부분 확인)


정리

  • O(N log N) 정렬로 N! 순열 탐색 대체
  • 문자열 붙이기 비교최대 문자열 보장
  • 선행 0 + 빈 배열 모든 케이스 대응

제출

import java.util.Arrays;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        String[] str_nums = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            str_nums[i] = String.valueOf(numbers[i]);
        }

        Arrays.sort(str_nums, (a, b) -> (b + a).compareTo(a + b));

        StringBuilder sb = new StringBuilder();
        for (String s : str_nums) {
            sb.append(s);
        }

        answer = sb.toString();
        answer = answer.replaceFirst("^0+", ""); // ✅ 선행 0 처리
               
        return answer.isEmpty() ? "0" : answer;  // ✅ 빈 배열 처리
    }
}
profile
Eazy하게

0개의 댓글