본문 바로가기

Java/코딩테스트

[java/프로그래머스/120882] 등수 매기기 (double, avgs.sort((a, b) -> Double.compare(b[1], a[1])), avgs.get(i)[1] != avgs.get(i-1)[1], rank = i + 1)

✏️ 문제 설명

영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.


✏️ code

📌 평균 점수
- int형으로 계산하면 1.5와 1.0이 모두 1로 저장되어 부정확한 평균이 저장됩니다. 따라서 double로 계산하였습니다.
- double avg = (score[i][0] + score[i][1]) / 2.0;

📌 내림차순 정렬
- avgs.sort((a, b) -> Double.compare(b[1], a[1]));

📌 등수 매기기
- if문: i = 0부터 시작하지만, 이전 평균 점수와 비교는 i = 1부터 합니다. 두 점수가 다르면 현재 인덱스(i)에 1을 더한 값으로 등수를 갱신합니다.
- result[(int) avgs.get(i)[0]]: 원래 인덱스에 등수를 저장해야 하므로 avgs.get(i)[0]을 불러오되, 이는 double이므로 (int)로 변환합니다.
import java.util.*;

class Solution {
    public int[] solution(int[][] score) {
        // 평균 점수
        List<double[]> avgs = new ArrayList<>();
        for (int i = 0; i < score.length; i++) {
            double avg = (score[i][0] + score[i][1]) / 2.0;
            avgs.add(new double[]{i, avg});
        }
        
        // 내림차순 정렬
        avgs.sort((a, b) -> Double.compare(b[1], a[1]));
        
        // 등수 매기기
        int[] result = new int[score.length];
        int rank = 1;
        for (int i = 0; i < avgs.size(); i++) {
            if (i > 0 && avgs.get(i)[1] != avgs.get(i-1)[1]) {
                rank = i + 1;
            }
            result[(int)avgs.get(i)[0]] = rank;
        }
        return result;
    }
}

 

반응형