본문 바로가기

Algorithm

[프로그래머스 - 정렬] 가장 큰수

문제 링크 : https://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 합니다.


예제 #1

input [6, 10, 2] return : "6210"


시행착오 

  1. 완전 탐색으로 풀면 시간 초과 에러가 발생한다.
  2. 0으로 패딩하거나 9로 패딩하여 자리수를 맞춰주어도 예외 케이스가 발생함.


풀이 순서

  1. numbers 배열내 숫자를 String으로 변환("6"+"10" = "610"을 만들기 위함, 물론 곱하기를 해도되지만...)
  2. Comparator 함수를 이용해 정렬 대상(o1, o2)를 o1+o2, o2+o1로 비교하여 큰수가 나오는 대상을 앞으로
  3. 0000000으로 나오는 결과는 "0"으로 예외처리
import java.util.*;
class Solution {
    
    static int max_size = 0;
    public String solution(int[] numbers) {
        String answer = "";
        
        ArrayList<String> list = new ArrayList<>();
        for(int i=0; i<numbers.length; i++){
            String tmp = numbers[i] + "";
            list.add(tmp);
            max_size = Math.max(max_size, tmp.length());
        }
        
        Collections.sort(list, new Comparator<String>(){
           @Override
            public int compare(String o1, String o2) {
                // TODO Auto-generated method stub
                int cmp1 = Integer.parseInt(o1+o2);
                int cmp2 = Integer.parseInt(o2+o1);
                
                if(cmp1> cmp2){
                    return -1;
                }else if(cmp2> cmp1){
                    return 1;
                }
                return 0;
            }
        });
        
        if(list.get(0).equals("0")){
            return "0";
        }else{
            for(int i=0; i<list.size(); i++){
                answer += list.get(i);
            }
            return answer;
        }
    }
    
}