https://school.programmers.co.kr/learn/courses/30/lessons/42746
처음에 Math.log10을 자리수를 알아낸 다음에
거기에 Math.pow()를 통해서 10의 n승을 통해서 숫자의 앞자리를 비교해서
정렬하려고 했었다.
그러나 이 경우에 앞자리가 같은 경우
생각할 부분이 너무 많았다.
앞자리가 같은 경우 자리수가 같다면 크기를 한번더 비교하고
자리수가 다르다면 990 90 ,
90,9 등 생각할 것이 많았기 때문에
풀다가 1시간 풀기로 한 제한 시간을 넘어가 포기했다.
다른 사람들의 풀이를 보았을 때
String 배열로 만들어서 사전 순으로 정렬하는 것에 대해서 배우게 되었다.
항상 compare이나 comparTo를 통해서 정렬하는 방법에 대해
잊어버리고 다시 보고를 반복하는거 같다.
일단 그 이전에 정리한 글을 복습했는데
Comparator의 compare은 return 값이 양수일 때 자리바꿈이 일어난다.
꼭 기억하자 양수일 때 자리 바꿈이 일어난다!
그리고 compareTo() 함수를 정리해보려고 한다.
숫자의 비교 : 단순히 크다(1) 작다(-1) 같다(0)
문자열 비교
String str = "abcd";
System.out.println(str.compareTo("ab"));//2
System.out.println(str.compareTo("a"));//3
System.out.println(str.compareTo("c"));//-2
여기서 보면 앞자리를 기준으로 시작되고
앞자리를 기준으로 서로 다른 길이를 반환한다.
예를 들어서 "abcd"와 "a"는 3자리가 다르므로 3이며
"abcd"와 "c"의 경우 앞자리를 기준으로 다르므로
"a"의 아스키코드 97 - "c"의 아스키코드 99= -2가 반환되는 것이다.
따라서 결국 compareTo를 통해서 두 문자열 중에서 누가 사전순으로 우위에 있는가를 비교할 수 있게 되는 것이다.
양수가 나오면 기준 문자열이 뒤에 나오는 것이고 음수가 나오면 기준 문자열이 더 앞에 나오는 것이다.
따라서 이렇게 양수, 음수, 0을 이용해서
Comparator의 compare() 함수를 이용하는 것이다!
import java.util.*;
class Solution {
public String solution(int[] numbers) {
String answer = "";
String[] arr = new String[numbers.length];
boolean tag = true;
for(int i=0;i<numbers.length;i++){
arr[i] = Integer.toString(numbers[i]);
if(numbers[i] !=0) tag=false;
}
Arrays.sort(arr, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
//s2의 앞자리가 s1의 앞자리보다 큰 경우 s2,s1
//s2의 앞자리가 s1의 앞자리보다 작은 경우 s1,s2
return (s2+s1).compareTo(s1+s2);
}
});
for(String s : arr){
answer+=s;
}
if(tag) return "0";
return answer;
}
}