Algorithm & Data Structure

[프로그래머스] 등수 매기기

후뿡이 2022. 11. 29. 16:44

첫 코드


class Solution {
    public int[] solution(int[][] score) {
        int[] answer = new int[score.length];
        Integer[] sorted = new Integer[score.length];
        List<Integer> average = new ArrayList<>();
        int before = -1;
        int before_index = -1;

        for (int i = 0 ; i < score.length ; i++){
            sorted[i] = ( score[i][1] + score[i][0] );
            average.add(sorted[i]);
        }

        Arrays.sort(sorted, Collections.reverseOrder());

        for (int i = 0 ; i < score.length ; i++){

            answer[average.indexOf(sorted[i])] = i+1;
            if (before == sorted[i]){
                answer[average.indexOf(sorted[i])] = answer[before_index];
            }
            before = sorted[i];
            before_index = average.indexOf(sorted[i]);
            average.remove(before_index);
            average.add(before_index,0);
        }

        return answer;
    }
}

등수를 저장하는 int[] answer

평균을 저장하는 List average

평균을 저장하고 순서대로 정렬하는 int[] sorted

 

sorted[] 를 정렬한 후에 그 값을 average에 찾아서 그 index를 받아 answer에 index +1 로 등수를 매긴다.

 

이 때 !!! 가장 문제는 average 값이 같을 때이다.

그래서 그 전 단계의 값과 전 단계의 index를 befor, before_index에 저장한다.

그리고 indexOf를 사용할 때 가장 먼저의 index가 나오므로 

average.remove 와 average.add를 이용해 average List에서 그 전 값을 0으로 바꿔준다.

 

실로 개같은 코드다 ...

 

수정 코드


class Solution {
    public int[] solution(int[][] score) {
        int[] answer = new int[score.length];
        List<Integer> sorted_average = new ArrayList<>();

        for (int i = 0 ; i < score.length ; i++){
            sorted_average.add( score[i][1] + score[i][0] );
        }

        sorted_average.sort(Comparator.reverseOrder());

        for (int i = 0 ; i < score.length ; i++){
            answer[i] = sorted_average.indexOf(score[i][0] + score[i][1]) + 1;
        }
        return answer;
    }
}

첫 코드와의 차이점은 점수가 같은 경우 중복을 제거하는 부분이 사라졌다는 것이다.

평균을 정리해놓은 list에서 indexOf를 사용하면 점수가 같더라도 어차피 가장 작은 index값이 출력 되므로 중복 부분을 다룰 필요가 없다 !!!!