문자열로 변환 후 풀어본 첫번째 풀이. 내림차순 정렬 말고는 크게 어려운 게 없었다. 다만 문제가 있다면, 굳이 문자열로 바꾸고, 문자열에서 다시 LONG으로 바꾸는 게 너무 비효율적이라 생각이 들었다. 그래서 해당 과정을 바꿔보기로 결정!
import java.util.*;
class Solution {
public long solution(long n) {
List<Integer> digits = new ArrayList<>();
String ns = Long.toString(n);
for (int i = 0; i < ns.length(); i++) {
char c = ns.charAt(i);
digits.add(Character.getNumericValue(c));
}
//내림차순 정렬
Collections.sort(digits, Collections.reverseOrder());
// 정렬된 리스트를 문자열로 변환
StringBuilder sb = new StringBuilder();
for (int digit : digits) {
sb.append(digit);
}
// 문자열을 long으로 변환
long sortedNumber = Long.parseLong(sb.toString());
return sortedNumber;
}
}
두번째 풀이는 자리수를 계산하고, 해당 자리수만큼 INT배열을 만들어서 풀었다. 변환이 한번이라 좋았지만, 이또한 자릿수 계산할 때 문자로 바꾸었기 때문에 조금 더 고민이 필요할 듯...
import java.util.*;
class Solution {
public long solution(long n) {
// 자릿수 계산
String numberStr = Long.toString(n);
int length = numberStr.length();
Integer[] digits = new Integer[length];
// 배열 저장
for (int i = 0; i < length; i++) {
digits[i] = numberStr.charAt(i) - '0';
}
// 내림차순 정렬
Arrays.sort(digits, Collections.reverseOrder());
// 반환값 설정
long sortedNumber = 0;
for (int digit : digits) {
sortedNumber = sortedNumber * 10 + digit;
}
return sortedNumber;
}
}
숫자와 문자는 자주 변환되는 문제들이 많아서 방식이 익숙해져야 하는데, 할 때마다 당황해서 메서드를 찾아본다. 이제 슬슬 암기가 필요할 타이밍...
회사에서 일할 때 종종 쓰지만 볼 때마다 낯선 Collections
에 대해 조금 더 고찰이 필요하다.