특이한 정렬 문제풀이
정수 n을 기준으로 n과 가까운 수부터 정렬,
만약 거리가 같다면 더 큰 수를 앞에 배치한다.
이 문제에서 더 가깝다는 것은 n과의 차이가 더 작다는 뜻이다.
n과의 차이를 구해서 절댓값의 오름차순으로 차이가 아닌 원래 데이터를 정렬을 하되 같은 값은 본래 값을 비교할 수 있어야 한다.
즉, 정렬 기준은 n과의 차이이고, 필요시 본래 값을 비교할 수도 있지만 정렬은 원래 배열을 정렬해야한다.
이 문제를 풀기 위해 처음엔 n과의 차이와 본래 값을 동시에 가질 수 있는 타입인
Map, 2차 배열을 고민했지만 정렬하기 불편한 한부분이 있었고
두가지 값을 가지면서 정렬이 용이하게하기 위해 클래스를 만드는 방법을 선택 했다.
Number 클래스를 만들고 클래스는 Comparable 인터페이스를 상속해 비교자를 만들어주면 Arrays.sort() 메소드를 사용할 수 있다 .
public int[] solution(int[] numlist, int n) {
int[] answer = new int[numlist.length];
// n과의 차이
Number[] nums = new Number[numlist.length];
for (int i = 0; i < numlist.length; i++) {
Number num = new Number(numlist[i], numlist[i] - n);
nums[i] = num;
}
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
answer[i] = nums[i].data;
}
return answer;
}
class Number implements Comparable<Number> {
int data;
int diff;
public Number(int data, int diff) {
super();
this.data = data;
this.diff = diff;
}
@Override
public int compareTo(Number o) {
if (Math.abs(o.diff) < Math.abs(this.diff))
return 1;
else if (Math.abs(o.diff) == Math.abs(this.diff)) {
if (o.diff < this.diff) {
return -1;
} else {
return 1;
}
} else
return -1;
}
}