[Programmers] Lv0 등수 매기기 Java
2023. 2. 2. 13:20ㆍCS/자료구조 & 알고리즘
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
'CS > 자료구조 & 알고리즘' 카테고리의 다른 글
[Programmers] Lv0 치킨 쿠폰 Java (0) | 2023.02.02 |
---|---|
[Programmers] Lv0 유한소수 판별하기 Java (0) | 2023.02.02 |
[Programmers] Lv0 특이한 정렬 Java (0) | 2023.02.01 |
[Programmers] Lv0 저주의 숫자 3 Java (0) | 2023.01.31 |
[Programmers] Lv0 다항식 더하기 Java (0) | 2023.01.30 |