인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

whdmscks11님의 프로필 이미지

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

8. 등수구하기

제 코드의 어떤 부분이 틀린지 모르겠습니다. (GPT도 오답인 케이스를 못찾아요..)

작성

·

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 + " ");
        }
    }
}
gpt1.png.webpgpt2.png.webpgpt3.png.webp

 

답변 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 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

질문 주신 내용은 점수 배열을 받아 각 점수에 대한 순위를 반환하려는 코드로 보입니다. 현재 코드가 잘못된 점은 동일한 점수가 있을 경우 올바른 순위를 반환하지 못한다는 것입니다. 기존 코드에서는 중복 점수에 대해 첫 등장 위치에 대한 순위만 반환하고 있습니다.

이 문제를 해결하기 위해서는, 점수 리스트에서 각 점수가 몇 번째로 높은지를 정확히 판단해야 합니다. 따라서, 기존의 sortedScores를 순회하는 방식은 중복 점수 처리를 고려하지 못하므로 이를 개선할 필요가 있습니다.

다음은 해결에 참고할 수 있는 링크와 유사한 문제에 대한 답변입니다:

  1. 저는 이렇게 풀어봤습니다!: 이 포스트에서는 점수를 정렬한 후, 원래 점수 배열과 정렬된 배열을 비교하며 순위를 구하는 방법을 설명하고 있습니다. 이를 참고하여 중복 점수 처리에 주의해 보는 것이 좋습니다.

또한, 주어진 테스트 이미지를 보면 점수들이 중복된 경우 각 점수에 대하여 동일한 순위가 부여된 것을 알 수 있습니다. 따라서, 동일한 점수의 첫 번째 마주친 순위가 아닌, 동일한 점수에 대해 동등한 순위 처리가 필요합니다. 이를 위해 다음과 같은 방법을 고려해 볼 수 있습니다.

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 + " ");
        }
    }
}

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.