Algorithm/Programmers

[Programmers - 자바] 가장 큰 수

tjddneva 2022. 3. 30. 20:36

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

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

참 골치아픈 정렬이다. 일단 숫자끼리 비교하기에는 너무 신경쓸게 많아서 문자열 바꿔서 compareTo 함수로 비교를 하려고 했다. 근데 다들 힘들어하듯(나만 어렵나) 3 이랑 30 이랑 34 이거 비교할때 34 > 3 > 30 이다. 매우 매우 짜증난다. 

 

어떻게 할까 생각한게 34 랑 3 비교할때 반복을 하면 좋지 않을까 햇다. 그니깐 34 > 33 이렇게 길이가 다를 경우 길이를 맞춰주고 비교하는 거다. 그치만 구현이 딸려서 그대로 죽었다.

 

다음에 생각한게 어차피 합칠껀데 앞에 오는게 이득인지 뒤에오는게 이득인지 알면 되니까! 두 개를 앞 뒤로 합친거를 비교하는 획기적인 생각을 하였다. 그니까 3 + 34 = 334 랑 34 + 3 = 343 이랑 비교하는 것이다! 343 이 크므로 34 > 3 인 것이다! 

코드도 (s1+s2).compareTo(s2+s1) 이렇게 하면 된다! 하하

 

이랫는데 예외가 한 개 더 있었다. 이거를 찾느라 아주 죽어버리는 줄 알았다. 여러모로 굉장히 짜증나는 문제다. 왜 도대체 예외를 안주는거야... 그 예외는 만약 0 0 0 0 0 들어오면 00000 이 아니고 0 을 출력해야한다... 쉣

 

전체 코드이다.

import java.util.*;
import java.io.*;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
        
        String[] arr = new String[numbers.length];
        for(int i=0; i<numbers.length; i++){
            arr[i] = Integer.toString(numbers[i]);
        }
        
        Arrays.sort(arr,new Comparator<String>(){
            
            @Override
            public int compare(String a, String b){
                
                return (b+a).compareTo(a+b);    
            }
        });
        
        if(arr[0].equals("0")) answer = "0";
        else{
            for(String s : arr){
                answer += s;
            }
        }
        
        return answer;
    }
    
}