
class Solution {
public String[] findRelativeRanks(int[] score) {
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
ArrayList<Integer> list = new ArrayList<>();
String[] rstArr = new String[score.length];
Arrays.stream(score).forEach(value -> pq.add(value));
Arrays.stream(score).forEach(value -> list.add(value));
int idx = 0;
while(!pq.isEmpty()) {
switch (idx){
case 0:
rstArr[list.indexOf(pq.poll())] = "Gold Medal";
break;
case 1:
rstArr[list.indexOf(pq.poll())] = "Silver Medal";
break;
case 2:
rstArr[list.indexOf(pq.poll())] = "Bronze Medal";
break;
default:
rstArr[list.indexOf(pq.poll())] = (idx + 1) + "";
break;
}
idx++;
}
return rstArr;
}
}
알게된 점 & 개선점
- Priority queue를 굳이 사용할 필요 없다. 정렬된 순서만을 따로 배열에 저장해 while문에서 쓰면 된다.
- indexOf는 순차 검색이라 오래 걸린다.
개선된 코드
class Solution {
public String[] findRelativeRanks(int[] score) {
int n = score.length;
Integer[] order = new Integer[n];
for (int i = 0; i < n; i++) {
order[i] = i;
}
Arrays.sort(order, (a, b) -> score[b] - score[a]);
String[] rstArr = new String[n];
for (int i = 0; i < n; i++) {
int arrIdx = order[i];
switch (i) {
case 0:
rstArr[arrIdx] = "Gold Medal";
break;
case 1:
rstArr[arrIdx] = "Silver Medal";
break;
case 2:
rstArr[arrIdx] = "Bronze Medal";
break;
default:
rstArr[arrIdx] = (i + 1) + "";
break;
}
}
return rstArr;
}
}

좋은 내용 보고 갑니다. 혹시 맞팔 가능하면 맞팔해서 함께 더 배워가요