본문 바로가기
프로그래머스/Lv.2

가장 큰 수 - JAVA, compareTo, lambda

by 아찌방 2025. 5. 16.

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

코드 & 풀이

 

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        int size = numbers.length;
        String[] s_numbers = new String[size];
        
        for (int i = 0; i < size; i++) {
            s_numbers[i] = String.valueOf(numbers[i]);
        }
        
        Arrays.sort(s_numbers, (a, b) -> (b + a).compareTo(a + b));
        
        if (s_numbers[0].equals("0")) return "0";
        
        StringBuilder result = new StringBuilder();
        for (String number : s_numbers) {
            result.append(number);
        }
        
        return result.toString();
    }
}

 

주어지는 numbers의 길이가 최대 100,000입니다.

 

이걸 조합으로 하면 터지겠죠?

 

그러면 우리는 문자열의 정렬을 이용할겁니다.

 

그것도 단순히 배열의 값을 기반으로 정렬하면 안됩니다.

 

numbers = {3, 30, 34, 5, 9} 일 때,

 

단순히 배열의 값으로 내림차순 정렬을 하면

 

numbers = {9, 5, 34, 30, 3} 이 됩니다.

 

이걸 이어붙이면 "9534303"이 되는데,

 

이는 우리가 원하는 "9534330"과 다르죠.

 

그렇기 때문에 우리는

 

문자열을 합쳐서 비교하는 겁니다.

 

String a, String b 가 있을 때,

 

a + b 와 b + a를 비교하는 겁니다.

 

a = 30, b = 3일 때

 

330와 303을 비교하는 것이죠.

 

그런식으로 정렬을 다 하면

 

numbers = {9, 5, 34, 3, 30}이 됩니다.

 

그러면 이걸 이어 붙여서 반환하면 끝입니다.

 

 

 

 

다음에 또 봐요

 

728x90