Hseong

[프로그래머스 고득점 kit - 정렬] - 가장 큰 수 본문

Algorithm/Java

[프로그래머스 고득점 kit - 정렬] - 가장 큰 수

__hseong__ 2025. 4. 29. 22:02
728x90
반응형

 

import java.util.Arrays;


class Solution {
    public String solution(int[] numbers) {
        
        // Step 1: int 배열을 String 배열로 변환
        String[] strNumbers = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            strNumbers[i] = String.valueOf(numbers[i]);
        }
        
        // Step 2: 정렬 - (o2 + o1)이 (o1 + o2)보다 크면 o2가 앞에 오게 정렬
        Arrays.sort(strNumbers, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
        
        // Step 3: 정렬된 문자열을 하나로 합치기
        StringBuilder sb = new StringBuilder();
        for (String s : strNumbers) {
            sb.append(s);
        }
        
        // Step 4: 0이 여러 개일 경우 (예: "000") => "0" 반환
        if (sb.charAt(0) == '0') {
            return "0";
        }
        
        return sb.toString();
    }
}
  • 해당 문제는 기본적으로 numbers라는 int 배열을 받으면 , 이 숫자들을 조합해서 가장 큰 수를 구해서 문자열로 최종 출력하는 것이다.
  • 일단 int 배열의 원소들이므로 해당 배열의 크기만큼 strNumbers라는 배열을 선언하고, for문을 돌면서 String.valueOf(원소) 구문을 통해 int 를 문자로 변환한다.
  • Arrays.sort(배열명) 만 사용하게되면 기본적으로 오름차순으로 정렬하지만, 이를 확장해서 사용하게된다면 위 코드처럼 사용할 수 있다
  • Arrays.sort(배열, (o1, o2) -> (o2+o1).compareTo(o1+o2)) --> 이것은 o2+o1 "106" vs o1+o2 "610" 비교해서 만약 앞에 식이 크다면 o2가 작은 수이므로 o1보다 앞으로 가게되고, 반대의 경우는 이와 반대로 생각하면 된다.
  • 그럼 step2 를 지났다면 가장 큰 수가 되는 방향으로 배열이 정렬이 되고, StringBuilder 를 이용하여 파이썬으로 치면 리스트처럼 사용한다.
  • 그럼 여기서 왜 StringBuilder를 사용하냐면 String에서는 불변이라 + 연산을 이용하면 매번 새 String 객체를 새로 만들어야돼서 속도가 느려 시간복잡도 차원에서 생각하면 비효율적이다. 그래서 StringBuilder를 통해 문자열을 메모리 위에서 수정하고 필요할 때 마다 변경가능하여 빠르기 때문이다.
  • 그래서 가장 큰 수가 되는 조합의 배열의 원소들을 for문을 통해 각각 append() 문을 통해서 붙이고, "000" 이렇게 0만 있는 경우 0만 출력하도록 if 문을 구현하여, 이상이 없다면 sb.toString()으로 문자열로 최종 return 하여 출력한다.
  • 아니 그러면 StringBuilder 그대로 출력하면 안되나?? 할 수 있겠지만 객체의 일부라 보이는 것만 같고 , 아래와 같이 다르기 때문에 꼭 toString() 구문을 통해 변환해서 출력해야한다.

 

728x90
반응형