정수 내림차순으로 배치하기 (Lv.1)
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
n은 1이상 8000000000 이하인 자연수입니다.
배열을 오름차순으로 정렬할 때는 sort()를 사용해 간단히 사용 가능하지만,
내림차순은 조금 더 많은 과정이 필요로 합니다.
내림차순으로 정렬하는 방법에는 여러가지가 있습니다.
1) 반복문 사용
2) Collections.reversOrder() 사용
3) reverse() 사용
이번 문제는 2번과 3번을 사용해 풀이를 진행하였습니다.
먼저 Collections.reversOrder() 을 사용하기 위해선 int, long 가 아닌 Integer, Long 와 같이 class 타입으로 배열을 선언해주어야 합니다.
이후 배열을 정렬해주며 내림차순을 위한 함수를 선언해줍니다.
→ Arrays.sort(arr, Collections.reverseOrder());
3번 방법의 경우 문자열을 다룰 때 자주 사용되는 방식입니다.
먼저 오름차순으로 정렬을 진행한 후 StringBuilder 를 선언해 reverse() 함수를 사용해줍니다.
정렬 자체를 바꾸는 것이 아닌 정렬된 결과를 뒤집는 방식으로 내림차순을 구현하는 방법입니다.
먼저 long을 하나씩 담아주기 위한 배열을 선언해줍니다.
→ List<Integer> 로도 선언 가능합니다.
이후 하나씩 구분하기 위해 반복문을 사용해 줍니다.
→ n % 10 으로 한 자리씩 배열에 담아주고,
→ n /= 10 으로 배열에 담은 수를 제거합니다.
이후 sort() 와 Collections.reverseOrder() 를 사용해 내림차순으로 정렬합니다.
정렬이 완료 되었다면 long 타입으로 return 하기 위해 StringBuilder 으로 배열을 하나의 문자열로 만들어 주고,
다시 long로 변환하여 return 해줍니다.
⌛ 시간 0.30ms ~ 1.00ms
public long solution(long n) {
Long[] arr = new Long[String.valueOf(n).length()];
for(int i = 0; i < arr.length; i++) {
arr[i] = n % 10;
n /= 10;
}
Arrays.sort(arr, Collections.reverseOrder());
StringBuilder sb = new StringBuilder();
for(long l : arr) {
sb.append(l);
}
return Long.parseLong(sb.toString());
}
먼저 long을 하나씩 담아주기 위한 String 배열을 선언한 후 split("") 를 이용해 하나씩 배열에 담아줍니다.
이후 sort() 를 사용해 오름차순으로 1차 정렬을 진행합니다.
오름차순 정렬 후 StringBuilder 를 이용해 배열의 값들을 하나로 합쳐준 뒤
reverse() 를 이용해 내림차순으로 정렬하며 long 타입으로 변환해 최종 return 합니다.
⌛ 시간 0.16ms ~ 0.20ms
public long solution1(long n) {
String[] arr = String.valueOf(n).split("");
Arrays.sort(arr);
StringBuilder sb = new StringBuilder();
for(String str : arr) {
sb.append(str);
}
return Long.parseLong(sb.reverse().toString());
}