코딩테스트/정렬

[프로그래머스] level 2 가장 큰 수 (자바)

leejunkim 2025. 11. 25. 14:48

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

[제한 사항]

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

[예시]

  • [6, 10, 2] -> "6210"
  • [3, 30, 34, 5, 9] -> "9534330"

문제 풀이

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String[] numList = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            numList[i] = String.valueOf(numbers[i]);
        }
        
        Arrays.sort(numList, (n1, n2) -> (n2 + n1).compareTo(n1 + n2));
        
        if (numList[0].equals("0")) {
            return "0";
        }
        StringBuilder sb = new StringBuilder();
        for (String n : numList) {
            sb.append(n);
        }
        return sb.toString();
    }
}
  • 먼저 numbers를 string으로 바꾸어준다
    • int는 primitive type이라서 toString()을 못쓰고 String.valueOf를 사용해야 했다 (아니면 + "" 사용)
  • 그 다음 정렬해준다: (n2 + n1).compareTo(n1 + n1)
    • n2가 앞에 붙은 숫자의 합이 다른 합보다 클 때, n2가 갚으로 와야한다
  • 만약에 첫번째 숫자가 0이면 입력값이 전부 0이란 소리가 된다
    • 그럴때는 "000' 처럼 0만 담긴 문자열을 리턴하는 대신 그냥 "0"만 리턴해준다
  • StringBuilder를 사용해서 값을 string으로 변환시켜준 뒤 돌려준다
    • += 를 사용할 수도 있었지만 StringBuilder이 효율성이 더 좋아서 이걸 사용했다