[Programmers]가장 큰 수(java/lv2)

Mijeong Ryu·2023년 6월 22일
0

Programmers

목록 보기
45/50

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

문제

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

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

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

제한 사항
numbers의 길이는 1 이상 100,000 이하입니다.
numbers의 원소는 0 이상 1,000 이하입니다.
정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
입출력 예
numbers return
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

코드

import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        StringBuilder answer = new StringBuilder();
        String[] stringNumbers = new String[numbers.length];
        boolean onlyZero = true;
        for(int i=0; i<numbers.length; i++){
            stringNumbers[i] = Integer.toString(numbers[i]);
            if(numbers[i]!=0){
                onlyZero = false;
            }
        }
        Arrays.sort(stringNumbers, new Comparator<String>() {
            @Override
            public int compare(String st1, String st2){
                return (st2+st1).compareTo(st1+st2);
            }
        });

        
        for(String str : stringNumbers){
            answer.append(str);
        }
        
        if(onlyZero){
            return "0";
        }
        return answer.toString();
    }
}

풀이

이 문제의 핵심은 int로 된 숫자들을 String으로 바꿔서 "사전적 순서"로 내림차순 하는 것이다.
예를들어 int의 경우 30>3 이지만 string의 경우는 3>30이다.
3 30 vs 30 3 의 경우 330을 return해주어야 하는 상황이기 때문에, input으로 받은 배열을 문자열으로 저장하고, "사전적 순서" 내림차순으로 새로운 문자열 배열 stringNumbers에 담아주었다.

그리고 comparator에서 (st2+st1).compareTo(st1+st2); -> 문자열을 +로 이어 붙힌 후 비교하여 내림차순으로 return하는 부분을 구현해주었다.
(오름차순이였다면 (st1+st2).compareTo(st2+st1); 로 사용)

테스트 케이스에서 틀린 경우가 있었는데, 처음 주어진 배열이 0으로만 구성된 경우,
"0"이 아닌 "00000"을 return해서 생긴 문제였다. 그래서 onlyZero 값을 만들어서
0이 아닌값이 하나라도 있으면 false로 처리하고, true일 때만 "0"을 return하게 예외처리 해주었다.

0개의 댓글