[Algorithm/java] 가장 큰 수

Jay·2020년 12월 15일
0

Algorithm

목록 보기
4/44
post-thumbnail

문제 설명

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

EX

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

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

제한 사항

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

입출력 예

1)
numbers [6, 10, 2]
return 6210

2)
numbers [3, 30, 34, 5, 9]
return 9534330


접근

  • 두 자리 이상의 수를 따로 분리할 필요는 없다.
  • 배열 내 모든 원소들은 그대로 조합만 하면 된다.
  • 앞 자리만 비교한다!(두 자리 수 이상의 수도 앞자리만!)
  • 앞 자리가 같다면? 두 자리 수가 우선! 둘 다 한자리라면 아무거나!

1) 일단 모든 원소를 새로운 배열에 저장. 이때, 두자리수의 원소는 앞자리만 저장.
2) 새로운 배열에서 비교, 같을 경우, 원래 배열에서 같은 인덱스 값을 비교해 두자리수 이상을 비교.

Code

import java.util.*;
import java.lang.*;

class Solution {
    public String solution(int[] numbers) {
        String answer = "";
       
        //int배열 string배열 전환
        String[] arr = new String[numbers.length];
        for(int i=0; i<numbers.length; i++){
            arr[i] = String.valueOf(numbers[i]);
        }
        
        //배열 정렬, 정렬 규칙으로는 2개를 더하여 더 큰 쪽이 우선순위가 되게 하는 
        Arrays.sort(arr, new Comparator<String>(){
            @Override
            public int compare(String s1, String s2){
                return (s2+s1).compareTo(s1+s2);
            }
        });
        
        //0만 들어올 상황 제거
        if(arr[0].equals("0")) return "0";
        
        for(int i=0; i<arr.length; i++){
            answer+=arr[i];
        }
        
        return answer;
    }

}

👀 생각해볼 점

  • 처음에는 int 배열 후, 첫 자리로만 비교하고 그 이후에 두자리수 이상일 경우 따로 비교를 택했는데.. 중첩문이 너무 많아져서 비효율적이었다.
  • Comparator의 compare를 오버라이드해서 쓰는 방법이 많이 나온다..

📌 KeyNote

  • Comparator<>() @Override compare.. 비교
  • int를 String으로 바꿀 때, String.valueOf()를 쓰는게 가장 효율적이라고 한다.
profile
developer

0개의 댓글