가장 큰 수(Java)

bearMin·2024년 2월 19일

🎯문제

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

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

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

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

입출력 예

numbersreturn
[6, 10, 2]"6210"
[3, 30, 34, 5, 9]"9534330"

✏️풀이

코드

import java.util.*;

class Solution {
    public String solution(int[] numbers) {
        String[] answer = new String[numbers.length];
        
        // 숫자 배열을 String으로 변환
        for(int i = 0; i < numbers.length; i++) {
            answer[i] = String.valueOf(numbers[i]);
        }
        
        // 두 수를 합친 값이 더 큰 순서대로 배열 정렬
        Arrays.sort(answer, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));
        
        // 배열의 첫번째 값이 0일 경우 "0" 반환
        // 0이 아닐 경우 배열을 하나의 문자열로 합쳐서 반환
        return answer[0].equals("0") ? "0" : String.join("", answer);
    }
}

설명

배열의 정렬을 사용하여 문제를 풀었다.

문제가 짧은 만큼 풀이 코드도 매우 간단하다.
사실 문제가 짧다고 풀이 코드가 짧은 경우는 거의 드물긴 하다;;

numbers로 주어지는 int형 값들을 answer에 String으로 바꿔서 저장을 해준다.
큰 값부터 순서대로 정렬을 해준 뒤에 모든 값읗 하나로 합치면 되는데, 이때 일반적인 정렬과는 다르게 두 값의 합이 큰 순서대로 정렬을 해준다.
예를 들어, o1 = 6, o2 = 10일 경우
일반적인 내림차순이라면 10, 6으로 정렬이 될 것이다.
그러나 우리는 o1 + o2와 o2 + o1의 값을 비교하여 더 큰 순서대로 정렬을 진행한다.
즉, 610과 106을 비교했을 때 610이 더 크기 때문에 6, 10의 순서대로 정렬을 진행하는 것이다. 이러한 방식은 코드가 직관적이며 간결하게 사용할 수 있다는 장점이 있다.

모든 정렬이 끝난 뒤에 반환을 진행해주는데 이때 배열의 모든 값이 0일 경우가 존재한다. 따라서 맨 앞의 값이 0이라면 "0" 하나만 반환을 해주고 0이 아니라면 String.join 함수를 사용해 하나의 문자열로 합쳐서 반환을 진행해 문제를 해결할 수 있다!


💡느낀 점

코드는 짧았지만 생각하기는 쉽지 않았다. 특히 정렬에 관련한 부분에서 어떤 식으로 정렬을 해주어야 문제를 해결할 수 있을지에 대해서 많은 고민을 하였다. 정렬을 내가 원하는 방식대로 바꾸는 코드가 익숙하지 않아 찾아보면서 문제를 풀었는데, 세상은 넓고 코드는 다양하다는 것을 느꼈다. 여러 방법 중 내가 이해하기 쉬운 코드로 문제를 풀었으나 성능의 측면에서 아쉬웠다. 다음에 비슷한 문제가 나온다면 성능의 측면도 고려해서 도전해봐야겠다.


링크

문제 링크

profile
소소한 공부기록

0개의 댓글