작성
·
94
·
수정됨
0
package section_2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class GetRank {
public static ArrayList<Integer> solution(int[] scores) {
ArrayList<Integer> list = new ArrayList<>();
Integer[] sortedScores = new Integer[scores.length];
Arrays.setAll(sortedScores, i -> scores[i]);
Arrays.sort(sortedScores, Comparator.reverseOrder());
System.out.println(Arrays.toString(scores));
System.out.println(Arrays.toString(sortedScores));
for (int score : scores) {
for (int j = 0; j < scores.length; j++) {
if (score == sortedScores[j]) {
list.add(j + 1);
break;
}
}
}
return list;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] scores = new int[n];
for (int i = 0; i < n; i++) {
scores[i] = sc.nextInt();
}
for (Integer i : solution(scores)) {
System.out.print(i + " ");
}
}
}
답변 2
0
안녕하세요^^
위 코드는 문제가 없어 보입니다. 제가 채점사이트에 아래코드를 넣어보니 통과되었습니다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static ArrayList<Integer> solution(int[] scores) {
ArrayList<Integer> list = new ArrayList<>();
Integer[] sortedScores = new Integer[scores.length];
Arrays.setAll(sortedScores, i -> scores[i]);
Arrays.sort(sortedScores, Comparator.reverseOrder());
//System.out.println(Arrays.toString(scores));
//System.out.println(Arrays.toString(sortedScores));
for (int score : scores) {
for (int j = 0; j < scores.length; j++) {
if (score == sortedScores[j]) {
list.add(j + 1);
break;
}
}
}
return list;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] scores = new int[n];
for (int i = 0; i < n; i++) {
scores[i] = sc.nextInt();
}
for (Integer i : solution(scores)) {
System.out.print(i + " ");
}
}
}
0
안녕하세요, 인프런 AI 인턴입니다.
질문 주신 내용은 점수 배열을 받아 각 점수에 대한 순위를 반환하려는 코드로 보입니다. 현재 코드가 잘못된 점은 동일한 점수가 있을 경우 올바른 순위를 반환하지 못한다는 것입니다. 기존 코드에서는 중복 점수에 대해 첫 등장 위치에 대한 순위만 반환하고 있습니다.
이 문제를 해결하기 위해서는, 점수 리스트에서 각 점수가 몇 번째로 높은지를 정확히 판단해야 합니다. 따라서, 기존의 sortedScores
를 순회하는 방식은 중복 점수 처리를 고려하지 못하므로 이를 개선할 필요가 있습니다.
다음은 해결에 참고할 수 있는 링크와 유사한 문제에 대한 답변입니다:
또한, 주어진 테스트 이미지를 보면 점수들이 중복된 경우 각 점수에 대하여 동일한 순위가 부여된 것을 알 수 있습니다. 따라서, 동일한 점수의 첫 번째 마주친 순위가 아닌, 동일한 점수에 대해 동등한 순위 처리가 필요합니다. 이를 위해 다음과 같은 방법을 고려해 볼 수 있습니다.
import java.util.*;
public class GetRank {
public static ArrayList<Integer> solution(int[] scores) {
ArrayList<Integer> list = new ArrayList<>();
int[] sortedScores = Arrays.stream(scores).boxed().sorted(Collections.reverseOrder()).mapToInt(Integer::intValue).toArray();
Map<Integer, Integer> rankMap = new HashMap<>();
int rank = 1;
for (int score : sortedScores) {
if (!rankMap.containsKey(score)) {
rankMap.put(score, rank);
}
rank++;
}
for (int score : scores) {
list.add(rankMap.get(score));
}
return list;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] scores = new int[n];
for (int i = 0; i < n; i++) {
scores[i] = sc.nextInt();
}
for (Integer i : solution(scores)) {
System.out.print(i + " ");
}
}
}
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.