
문제설명
함수 solution은 정수 n을 매개변수로 입력받습니다.
n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요.
예를들어 n이 118372면 873211을 리턴하면 됩니다.
public static void main(String[] args) {
long n = 118372;
long answer = 0;
answer = getAscending(n);
System.out.println(answer);
}
위와 같은 정수가 주어졌을때 내림차순으로 정렬하여야 한다.
문제를 보자마자 배열이 떠올랐다.
Long타입의 정수를 문자열 형태로 변환하여 저장하고 charAt 함수를 통해 한자리씩
int형 배열에 담아서 요소를 비교하면서 정렬하면 될것같았다.
public static long getAscending(long n) {
String num = String.valueOf(n); // Long형의 정수를 int형 배열에 한자리수씩 담아주기 위해 String형으로 변환
int[] Arr = new int[num.length()];
for(int i = 0; i < num.length(); i++) {
Arr[i] = num.charAt(i) - '0'; // charAt 함수를 사용하니 결과가 이상했다. (- '0') 을 해주니 결과가 잘 나왔다. (ASCII와 관련 있다고 한다.)
}
Arrays.sort(Arr); // 배열에 담아준 뒤 sort 함수를 사용해 오름차순 정렬을 먼저 하였다.
for(int i = 0; i < Arr.length/2; i++) { // 오름차순 된 배열은 처음부터 끝까지 전부 비교하지 않아도 되기 때문에 '/2' 하여 중간까지만 비교하게 하였다.
int temp = 0;
if(Arr[i] <= Arr[Arr.length - 1 - i]) { // 배열의 시작과 끝부터 비교하여 중간까지 비교하면서 내림차순으로 정렬해준다.
temp = Arr[Arr.length - 1 - i];
Arr[Arr.length - 1 - i] = Arr[i];
Arr[i] = temp;
}
}
StringBuilder resultStr = new StringBuilder(); // 문자열로 만든 후 Long형으로 변경해줄 생각이기 때문에 변경이 잦다. StringBuilder로 변수를 생성하자.
for(int number : Arr) { // 배열을 순차적으로 돌면서 변수에 넣어주자
resultStr.append(number);
}
return Long.parseLong(resultStr.toString()); // StringBuilder 변수를 Long형으로 변환하여 반환하자.
}
위 처럼 문제를 해결했는데, 아무래도 반복문이 많다보니 비효율적인것 같다.
문자열 배열로 만들어 Collections.sort와 Collections.reverseOrder()를 함께 사용하는 방법으로도 문제를 해결하던데 이게 더 깔끔하게 처리가 되지 않을까 싶은 생각이 들었다.