문제 설명
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.
예를 들어, 주어진 정수가 [6, 10, 2]
라면 [6102, 6210, 1062, 1026, 2610, 2106]
를 만들 수 있고, 이중 가장 큰 수는 6210
입니다.
0 또는 양의 정수
가 담긴 배열 numbers
가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수
를 문자열로 바꾸어 return
하도록 solution 함수를 작성해주세요.
제한 사항
입출력 예
나의 풀이
1. 우선 ,주어진 numbers배열을 차례로 받아서 문자열로 변환
했다
2. 문자열로 반환한 numbers배열을 List에 저장
하여 내림차순으로 정렬
하였다.
이 때, 예를들어
30과 3
이 있다고 가정하면, 내림차순으로 정렬할 때,30-3
이렇게 된다. 하지만이 둘을 이어붙였을 때 큰 수는 3-30
으로 정렬될 때이므로테스트 케이스를 통과하지 못했다.
3. 문제의 제한 조건에서numbers의 원소는 최대 1000
이므로. 주어진 원소를3번 연속 이어붙여 비교
하였다. 3번 이어붙인 이유는원소의 크기가 최대 1000
이므로 만약 원소가한자리 수일 때를 가정해서 조건
을 준 것이다. 그러면자연스럽게 재정의한 compare함수 내
에서세자리수까지 비교
가 되므로,내가 원하는 대로 정렬
할 수 있다.
예를 들면, 30과 3을 비교할 때
303030
과333
을 비교한다. 그러면3이 앞
에 오게되어 나의 의도대로 정렬할 수 있었다.
길이가 2이상
인 numbers의 모든 원소가 '0'
이라면, 마지막의 return값은 00000.....
처럼 0이 무수히 많이 나오는 케이스
가 되므로 통과하지 못한다. 그러므로 마지막에 정렬한 List의 첫 번째 원소
가 0이라면 그냥 answer = "0"을 return
해줌으로써, 예외처리
를 해주었다.import java.util.*;
import java.lang.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
int sum = 0;
ArrayList<String> list = new ArrayList<>();
for(int i=0;i<numbers.length;i++){
list.add(Integer.toString(numbers[i]));
}
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
return (s2+s2+s2).compareTo(s1+s1+s1);
}
});
for(int i=0;i<list.size();i++){
answer = answer + list.get(i);
}
if(answer.charAt(0)=='0'){
answer = 0 + "";
}
return answer;
}
}