728x90
반응형
알고리즘 스터디를 진행하면서 이전에 만들어둔
정수 내림차순으로 정렬하기 가 계속 신경쓰였었다.
헌데 의외의 결과를 보고 아쉬움을 털어낼 수 있었다.
가독성 좋은 코드는 속도도 더 빠른가?
토글 ( 쓰레기통 아님 )
public long solution(long n) {
int lengthNum = 1;
long tmp = n;
long answer = 0;
for (int i = 0; 0 != (tmp /= 10) ; i++){ lengthNum++; }
long[] answerArray = new long[lengthNum];
for (int i = 0; i < lengthNum ; i++ ) {
if (10 < n)
answerArray[i] = (n % 10);
else
answerArray[i] = n;
n /= 10;
}
long sortTmp = 0;
for (int i = 0; i < lengthNum; i++) {
for (int j = 0; j < lengthNum -1; j++) {
if (answerArray[i] > answerArray[j]) {
sortTmp = answerArray[i];
answerArray[i] = answerArray[j];
answerArray[j] = sortTmp;
}
}
}
for (long l : answerArray)
answer = answer * 10 + l;
return answer;
}
이전에 정렬을 해보겠다고 sort.Array()
같이 좋은걸 두고 이딴걸 만들었다는 생각에 조금 현타를 느꼈었다.
굳이 줄이고 깔끔하게 만들고자 한다면 나는
public slong solution(long n) {
long answer = 0L;
char[] tmp = Long.toString(n).toCharArray();
Arrays.sort(tmp);
for (int i = (int)Math.log10(n) + 1; 0 < i; i--)
answer = answer * 10 + ((tmp[i - 1] - 48));
return answer;
}
이렇게 정리할 수 있었다.
굳이 stream()
을 사용하지 않아도 바꿀 수 있었길래 굳이 속도 부담을 주지 않았다.
결과
그럼에도 불구하고 꽤 오래 걸린 모습을 보았다.
그러다 문득... 이전 코드를 다시 돌려보게 되었다.
선택 정렬은 sort.Array()
보다 얼마나 느릴까
결과
선택정렬이 스무배 더 빨랐다.
분명 내 선택정렬은 이중 for
문을 돌기에 n²
의 복잡도를 가지기에 Quicksort
형태인 sort.Array()
가 더 빠를것이라 생각했지만 의외의 결과를 내보였다.
결론
그다지 큰 이슈는 아니었다. 그저
public long solution(long n)
매개변수로 들어오는 n의 데이터가 너무 작았기 때문에 오히려 Quicksort
를 사용하는 처리가 더 늦었을 뿐이었다.
다만 약간의 자신감을 얻기도 했다.
내 손에서 수십줄을 거쳐야 해결되는 문제를
단 한두줄로 출력하는 사람들을 보며 그 활용도에 감탄과 동시에 불안함을 느꼈는데
항상 짧고 가독성 좋은 코드만이 최적의 결과를 내진 않는다는 것을 체감 했기 때문이다.
728x90
반응형
'TIL' 카테고리의 다른 글
2023년 11월 3일 multiThread (0) | 2023.11.03 |
---|---|
2023년 11월 2일 try catch finally (0) | 2023.11.03 |
2023년 10월 31일 상속과 포함 (0) | 2023.10.31 |
2023년 10월 30일 mapToInt() (0) | 2023.10.30 |
2023년 10월 29일 (0) | 2023.10.30 |