프로그래머스 : 등수 매기기

Digeut·2023년 3월 22일
0

프로그래머스

목록 보기
26/164

❔문제설명

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

⚠️제한사항

0 ≤ score[0], score[1] ≤ 100
1 ≤ score의 길이 ≤ 10
score의 원소 길이는 2입니다.
score는 중복된 원소를 갖지 않습니다.

🤔아이디어

[0][0]과 [0][1]의 값들의 평균을 구해서 그 평균값들의 배열을 만든 다름 그걸 ArrayList에 정렬시키면 안될까?

❌틀린코드

class Solution {
    public int[] solution(int[][] score) {
        int[] answer;
        float[] avg = new float[score.length];
        for(int i = 0 ; i < score.length ; i++){
            avg[i] = (float)((score[i][0] + score[i][1]) / 2);
       }
        
        answer = new int[score.length];
        for(int j = 0 ; j < score.length ; j++){
            int lank = 1;
            for(int k = 0 ; k < score.length ; k++){
                if(avg[j]<avg[k]) lank++;
                answer[j] = lank;
            }
        }
        
        return answer;
    }
}

🙄오류

코드풀이는 됐는데 정확성이 떨어진다.. 코드가 좀 길어져서 그런가?

💡코드풀이

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

class Solution {
    public int[] solution(int[][] score) {
        
        List<Integer> sumScoreList = new ArrayList<>();
        for(int[] s : score){
            sumScoreList.add(s[0] + s[1]);
        }
        sumScoreList.sort(Comparator.reverseOrder());
        
        int[] answer = new int[score.length];
        for(int i = 0 ; i < score.length ; i++){
            answer[i] = sumScoreList.indexOf(score[i][0] + score[i][1]) + 1;
        }
        
        return answer;
    }
}

for문의 반복이 많아서 정확도가 떨어지는것 같아서 foreach 사용해서 리스트의 값을 가져와 반복하는걸로 바꾸고, 평균을 구하지 않고 수학과 영어의 합 자체 크기의 비교로 진행했다. Comparator.reverseOrder()를 이용해서 두 매개변수의 값을 비교하면서 내림차순으로 (성적 순위이니까)정렬하고 둘 합의 인덱스 값을 찾아와 대입했다(+1은 인덱스 값이 0일때를 대비해 더해줌)

profile
개발자가 될 거야!

0개의 댓글