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

yseo14·2025년 4월 21일

코딩테스트 대비

목록 보기
73/88

문제 링크

풀이

틀린 첫번째 풀이

Arrays.sort(arr, (a, b) -> {
            String sa = String.valueOf(a);
            String sb = String.valueOf(b);
            
            return sb.compareTo(sa);
        });

처음에 접근한 방식은 배열의 각 숫자들을 문자열로 바꾸고, 내림차순으로 정렬한 뒤 이어붙이는 거였다.
그렇게 되면 각 숫자의 제일 앞에 자리부터 비교하며 큰 수가 제일 앞에 오게 되고, 그대로 이어붙이면 가장 큰 수가 될 것이라고 생각했지만 틀린 접근이었다.

{10, 2, 20, 201} -> {2, 201, 20, 10}

좌측 배열을 위 방식으로 정렬하면 우측의 배열이 된다.
하지만 저렇게 이어붙여 만들어진 22012010보다 {2, 20, 201, 10}을 이어붙인 22020110이 더 큰 수가 된다.

올바른 정렬 방법
두 수를 이어 붙였을 때, a + b, b + a 중에 더 큰 숫자가 되는 순서로 정렬을 해야한다.

 Arrays.sort(arr, (a, b) -> {
            String ab = a.toString() + b.toString();
            String ba = b.toString() + a.toString();
            return ba.compareTo(ab);
        });

코드

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        Integer[] nums = new Integer[numbers.length];

        for (int i = 0; i < numbers.length; i++) {
            nums[i] = numbers[i];
        }
        
        Arrays.sort(nums, (a, b) ->{
            String ab = a.toString() + b.toString();
            String ba = b.toString() + a.toString();
            
            return ba.compareTo(ab);
        });
            
        StringBuilder sb = new StringBuilder();
        for (int num : nums) {
            sb.append(num);
        }
        
        String result = sb.toString();
        if (result.charAt(0) == '0') result = "0";	//	만들어진 문자열이 0의 연속일 경우 0 출력 ex) 000000
        
        return result;
    }
}
profile
like the water flowing

0개의 댓글