[Programmers] Lv0 등수 매기기 Java

2023. 2. 2. 13:20CS/자료구조 & 알고리즘

728x90

문제 출처

[프로그래머스 코딩 테스트 연습]

https://school.programmers.co.kr/learn/courses/30/lessons/120882

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

  • 정렬하는 것으로 해당 문제를 풀어보았다.
  • 문제 풀이 과정은 다음 단계로 이루어진다.
  • 1 : 평균값과 index를 가진 List를 평균에 대해 오름 차순으로 정렬을 한다.
    → 정렬을 했으므로 공동 등수를 생각하지 않는 등수가 만들어진다.
    → 1번은 ArrayList에 저장을 했고 내장함수를 이용해서 정렬을 하였다.
    → 평균이아니라 덧셈을 하더라도 등수의 영향이 없고 실수 연산을 안 해도 된다.
  • 2 : 공동 등수를 위해 등수를 매길 범위 변수를 생성하고 공동 등수 조건이 아닐 때 이범 위에 해당하는 것들을 전부 등수를 매긴다.
    → 공동 등수를 위한 조건은 현재 학생 점수와 다음 학생 점수가 같으면 해당 학생들은 전부 공동 등수를 받는다.
    → 범위에 해당하는 학생들을 등수를 매기면 등수 바꿔준다.
         (공동 등수 횟수) + 1(다음등수)를 더해주면 된다.

 

소스 코드

import java.util.ArrayList;

public class Solution {

    public int[] solution(int[][] score) {

        int[] answer = new int[score.length];

        ArrayList<int[]> scoreList = new ArrayList<>();

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

        scoreList.sort((o1, o2) -> o2[0] - o1[0]);

        int rank = 1;
        int rank_range = 0;
        for (int i = 0; i < scoreList.size(); i++) {
            int[] s = scoreList.get(i);
            int[] nextS = i == scoreList.size()-1 ? new int[] {-999, -999}: scoreList.get(i+1);
            if (s[0] == nextS[0])
                rank_range++;
            else {
                for (int j = i - rank_range; j <= i; j++)
                    answer[scoreList.get(j)[1]] = rank;
                rank += rank_range + 1;
                rank_range = 0;
            }
        }

        return answer;
    }
}
728x90