Programmers 코딩테스트 연습 Lv.1을 시작했다. 10분 이상 고민한 문제만 블로깅 할 예정이다. 이 단계부터는 리팩토링 하는 과정을 통해 실행시간과 메모리를 효율적으로 사용하는 방법을 터득할 것이다.
함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.
import java.util.Arrays;
import java.util.stream.*;
import java.util.Collections;
class Solution {
public long solution(long n) {
int[] digits = Stream.of(String.valueOf(n).split("")).mapToInt(Integer::parseInt).toArray();
Integer[] digits2 = new Integer[digits.length];
for(int i = 0; i < digits.length; i++) {
digits2[i] = digits[i];
}
Arrays.sort(digits2,Collections.reverseOrder());
String s = "";
for(int i : digits2) s += i;
return Long.parseLong(s);
}
}
코드는 통과되었지만 실행시간이 비효율적이다.
💡 reverseOrder 대신 StringBuilder의 reverse()를 사용하였다.
💡 이로 인해 Integer타입 배열에 복사하여 역순 정렬을 하는 부분이 리팩토링 되었다.
import java.util.Arrays;
class Solution {
public long solution(long n) {
String[] strArr = String.valueOf(n).split("");
Arrays.sort(strArr);
StringBuilder sb = new StringBuilder();
for(String s : strArr) sb.append(s);
return Long.parseLong(sb.reverse().toString());
}
}