99클럽 코테 스터디 27일차 TIL - 메달 순위

수삼·2024년 11월 24일
0

코딩테스트

목록 보기
33/44

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;        
    }
}

알게된 점 & 개선점

  1. Priority queue를 굳이 사용할 필요 없다. 정렬된 순서만을 따로 배열에 저장해 while문에서 쓰면 된다.
  2. 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;        
    }
}

1개의 댓글

comment-user-thumbnail
2024년 11월 25일

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

답글 달기