연습문제
🔥 문자열 내 맘대로 정렬하기 🔥
문자열로 구성된 리스트 strings와 정수 n이 주어졌을때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하는 solution을 완성해보자
strings | n | return |
---|---|---|
["sun", "bed", "car"] | 1 | ["car", "bed", "sun"] |
["abce", "abcd", "cdx"] | 2 | ["abcd", "abce", "cdx"] |
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = {};
ArrayList<String> list = new ArrayList<String>();
for(int i=0;i<strings.length;i++){
list.add(strings[i].charAt(n)+strings[i]);
}
answer = list.toArray(new String[list.size()]);
Arrays.sort(answer);
for(int i=0;i<answer.length;i++){
answer[i] = answer[i].substring(1);
}
return answer;
}
}
성능 : 메모리: 89.9 MB, 시간: 9.10 ms
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
Arrays.sort(strings, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
if(s1.charAt(n) > s2.charAt(n)) return 1;
else if(s1.charAt(n) == s2.charAt(n)) return s1.compareTo(s2);
else if(s1.charAt(n) < s2.charAt(n)) return -1;
else return 0;
}
});
return strings;
}
}
성능 : 메모리: 75.7 MB, 시간: 0.45 ms
성능차이 어마어마하다. 그동안 성능은 비교하지 않고 푸는 방법에 대해서만 생각했는데 내 코드는 9초가 걸리는에 위의 코드는 1초도 걸리지 않는다.
처음에는 나도 compare을 오버라이드 해볼생각이었는데 도전하지 않았다. 좋은 방법을 생각하고서도 그렇게 풀지 않다니...
데이터정렬 - Comparable, Comparator 를 보면
다른 방식으로 정렬하고 싶다면 Comparator를 사용해야 한다.
Comparator 인터페이스는 기준을 담당하는 것으로 정렬하기 전에 기준을 세우는건 딱 한번만 일어나는 일회성인 활동이기 때문에 익명 클래스로 많이 사용된다.
➕ compare은 리턴값이 양수이면 두 객체의 자리를 바꿔주는 역할
strings는 string을 담고있는 배열이기 때문에 string인 s1과 s2를 비교한다.
s1의 n번째 문자가 s2의 n번째 문자보다 크다면 1을 반환
즉, s1이 오른쪽으로
같다면 사전순으로 s1.compareTo(s2)를 반환
s1의 n번째 문자가 s2의 n번째 문자보다 작다면 -1을 반환
즉, s1이 왼쪽으로
이외의 경우는 0을 반환
Comparator의 반환값에 따라서 달라는 것 체크!!
다른 분들의 코드를 참고할때 성능도 함께 비교하자!