함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
n은 1이상 8000000000 이하인 자연수입니다.
| n | return |
|---|---|
| 118372 | 873211 |
[1]
class Solution {
public long solution(long n) {
long answer = 0;
String s = n + "";
int[] n_list = new int[s.length()];
for(int i = 0; i < s.length(); i++) {
n_list[i] = (int)(n % 10);
n /= 10;
}
for(int i = 0; i < s.length(); i++) {
for(int j = i + 1; j < s.length(); j++) {
if(n_list[i] < n_list[j]) {
int tmp = n_list[i];
n_list[i] = n_list[j];
n_list[j] = tmp;
}
}
}
answer = Long.parseLong(Arrays.toString(n_list));
return answer;
}
}
입력받은 n을 문자열로 바꾼 뒤 리스트를 만들고 정렬을 한 뒤, 리스트를 다시 스트링배열로 바꾼 뒤 Long형태로 바꾸는 식으로 문제를 풀었다.
하지만 이렇게하면 다음과 같은 오류가 발생한다.

이 오류는 숫자가 아닌 값을 변환할 때 발생하는 오류이다.
Arrays.toString(n_list)를 하면서 string이 [8, 7, 3, 2, 1, 1]이런식으로 저장이 되었기 때문에 parseLong을 하는 과정에서 숫자가 아닌값이 포함이 되어있어서 발생했다.
이 문제의 해결 방법은 숫자 이외의 문자들( [, ], ',')을 제거하기 위해서 replaceAll을 사용한다.
String str = Arrays.toString(n_list).replaceAll("[^0-9]","");
answer = Long.parseLong(str);
[^0-9]의 뜻은 숫자 빼고 모든 문자를 뜻한다.
replaceAll을 사용하면 오류없이 컴파일이 된다.
[2]
class Solution {
public long solution(long n) {
long answer = 0;
String[] s = Long.toString(n).split("");
Arrays.sort(s, Collections.reverseOrder());
answer = Long.parseLong(String.join("", s));
return answer;
}
}
Long.toString().split()을 이용하여 훨씬 편하게 String 배열로 변환한 뒤
sort함수를 이용하는데 기본적으로 오름차순이기때문에 Collections.reverseOder()을 이용하여 내림차순으로 바꿔준다.
그리고 String.join을 이용하여 String 배열을 문자열로 바꿔준 뒤 parseLong을 이용하여 long형태로 변환한다.
split과 join을 잘 사용하니 이렇게 간편해진다.. 많이 배워야겠다.