오늘의 학습 키워드
https://leetcode.com/problems/relative-ranks/
문제
You are given an integer array score of size n, where score[i] is the score of the ith athlete in a competition. All the scores are guaranteed to be unique.
The athletes are placed based on their scores, where the 1st place athlete has the highest score, the 2nd place athlete has the 2nd highest score, and so on. The placement of each athlete determines their rank:
- The 1st place athlete's rank is "Gold Medal".
- The 2nd place athlete's rank is "Silver Medal".
- The 3rd place athlete's rank is "Bronze Medal".
- For the 4th place to the nth place athlete, their rank is their placement number (i.e., the xth place athlete's rank is "x").
Return an array answer of size n where answer[i] is the rank of the ith athlete.
예제
Example 1:
Input: score = [5,4,3,2,1]
Output: ["Gold Medal","Silver Medal","Bronze Medal","4","5"]
Explanation: The placements are [1st, 2nd, 3rd, 4th, 5th].
Example 2:
Input: score = [10,3,8,9,4]
Output: ["Gold Medal","5","Bronze Medal","Silver Medal","4"]
Explanation: The placements are [1st, 5th, 3rd, 2nd, 4th].
- 완주하지 못
공부한 내용 본인의 언어로 정리하기
문제분석
- 주어진 정수형 배열 score는 점수의 대한 값이 선언되어있다.
- 선언된 점수가 높을수록 순위가 높아지며, 1~3순위는 골드,실버,브론즈메달이 표기되며 나머지 등수를 등수의 숫자가 표기된다.
- 단, 출력 시 등수 별이 아니라 score 인덱스 순으로 표기해야한다.
접근 방법
- 등수 별이 아니라 score의 인덱스 별로 출력해야되기 때문에 (점수, 인덱스)형태의 자료구조가 필요하다.
- 이차원배열을 이용
- 배열[i][0] = 점수
- 배열[i][1] = 인덱스
- 그런다음 점수기준 내림차순 정렬하여 해결하였다.
구현 코드
import java.util.*;
class Solution {
public String[] findRelativeRanks(int[] score) {
int[][] scoreWithIndex = new int[score.length][2];
for (int i = 0; i < score.length; i++) {
scoreWithIndex[i][0] = score[i]; // 점수
scoreWithIndex[i][1] = i; // 인덱스
}
Arrays.sort(scoreWithIndex, (a, b) -> b[0] - a[0]);
String[] result = new String[score.length];
for (int i = 0; i < scoreWithIndex.length; i++) {
int index = scoreWithIndex[i][1];
if (i == 0) {
result[index] = "Gold Medal";
} else if (i == 1) {
result[index] = "Silver Medal";
} else if (i == 2) {
result[index] = "Bronze Medal";
} else {
result[index] = String.valueOf(i + 1);
}
}
return result;
}
}
코드 스페닛
1. 입력 데이터 준비
- 점수와 원래의 인덱스를 저장하기 위해 scoreWithIndex 배열을 생성.
- 각 점수와 인덱스를 저장하는 반복문 작성.
// 1. 점수와 인덱스를 함께 저장하기 위한 배열 생성
int[][] scoreWithIndex = new int[score.length][2];
for (int i = 0; i < score.length; i++) {
scoreWithIndex[i][0] = score[i]; // 점수 저장
scoreWithIndex[i][1] = i; // 원래 인덱스 저장
}
2. 점수 정렬
- Arrays.sort를 사용하여 점수를 기준으로 내림차순 정렬.
- 정렬 기준으로 Comparator 람다식을 사용.
// 2. 점수를 기준으로 내림차순 정렬
Arrays.sort(scoreWithIndex, (a, b) -> b[0] - a[0]);
3. 순위 결정
- 정렬된 점수의 순서에 따라 메달("Gold Medal", "Silver Medal", "Bronze Medal") 또는 순위를 문자열로 저장.
- 원래 배열의 인덱스를 참조하여 결과 배열에 값 할당.
// 3. 결과를 저장할 문자열 배열 생성
String[] result = new String[score.length];
for (int i = 0; i < scoreWithIndex.length; i++) {
int index = scoreWithIndex[i][1]; // 원래 인덱스 가져오기
// 4. 순위에 따라 메달 또는 숫자 순위 부여
if (i == 0) {
result[index] = "Gold Medal"; // 1위
} else if (i == 1) {
result[index] = "Silver Medal"; // 2위
} else if (i == 2) {
result[index] = "Bronze Medal"; // 3위
} else {
result[index] = String.valueOf(i + 1); // 나머지 순위
}
}
오늘의 회고
요즘 다른 부트캠프를 같이 진행하다 보니 코테문제를 잘 풀지 못했다, 이제 1주일 정도 남았는데 모두 풀 수 있도록 노력해야 될 듯
- 이차원 배열 정렬 방법 알아보기
- 완주하지