카테고리 없음

[HSAT 5회 정기 코딩 인증평가 기출] 성적 평가 *

베리영young 2024. 7. 1. 21:28

사용 알고리즘: 구현

사용 언어: java

 

왜 오답이 나오는지 모를 코드

import java.io.*;
import java.util.*;

public class Main {
    static int n; //n명 인원
    static int[] sumScore; // {사람 번호 , 최종 점수}

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        n = Integer.parseInt(br.readLine()); //인원 수
        sumScore = new int[n];
        
        for(int play=0; play<3; play++) {
            PriorityQueue<int[]> scores = new PriorityQueue<>((o1, o2) -> o2[1] - o1[1]);

            st = new StringTokenizer(br.readLine());
            for(int p=0; p<n; p++) {
                int score = Integer.parseInt(st.nextToken());
                sumScore[p] += score;
                scores.add(new int[] {p, score});
            }

            ranking(scores);
        }
        //

        PriorityQueue<int[]> scores = new PriorityQueue<>((o1, o2) -> o2[1] - o1[1]);
        for(int i=0; i<n; i++) {
            scores.add(new int[] {i, sumScore[i]});
        }
        ranking(scores);
    }

    private static void ranking(PriorityQueue<int[]> scores) {
        // {사람 번호 , 점수}
        int[] rank = new int[n];

        int sameRankCnt = 1;
        int grade = 1;

        int[] firstPlayer = scores.poll();
        int prevGrade = firstPlayer[1];
        rank[firstPlayer[0]] = grade;

        while(!scores.isEmpty()) {
            int[] player = scores.poll();

            if(player[1] == prevGrade) {
                rank[player[0]] = grade;
                sameRankCnt++;
            }
            else {
                grade += sameRankCnt;
                rank[player[0]] = grade;
                sameRankCnt = 1;
            }
        }

        //출력
        for(int i=0; i<n; i++)
            System.out.print(rank[i]+" ");
        System.out.println();
    }
    
}

 

 

고친 코드

import java.io.*;
import java.util.*;

public class Main {
    static int n; //n명 인원
    static int[][] scores, sumScores; // {사람 번호 , 최종 점수}

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        n = Integer.parseInt(br.readLine()); //인원 수
        sumScores = new int[n][2];
        scores = new int[n][2];
        for(int i=0; i<n; i++) {
            sumScores[i] = new int[] {i, 0};
        }

        for(int play=0; play<3; play++) {
            st = new StringTokenizer(br.readLine());
            
            for(int i=0; i<n; i++) {
                int score = Integer.parseInt(st.nextToken());
                scores[i] = new int[] {i, score};
                sumScores[i][1] += score;
            }
            // for(int i=0; i<n; i++)
            //     System.out.println(Arrays.toString(scores[i]));

            ranking(scores);
        }

        // for(int i=0; i<n; i++)
        //     System.out.println(Arrays.toString(sumScores[i]));
        ranking(sumScores);
        
    }

    private static void ranking(int[][] arr) {
        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] a, int[] b) {
                return b[1] - a[1];
            }
        });
        // for(int i=0; i<n; i++)
        //     System.out.println(Arrays.toString(arr[i]));

        int[] rank = new int[n];
        int[] ans = new int[n];

        int cnt = 1;
        rank[0] = cnt;
        for(int i=1; i<n; i++) {
            if(arr[i-1][1] != arr[i][1]) cnt = i+1;
            rank[i] = cnt;
        }

        for(int i=0; i<n; i++) {
            ans[arr[i][0]] = rank[i];
        }

        StringBuilder sb = new StringBuilder();
        for(int i=0; i<n; i++)
            sb.append(ans[i]+" ");
        System.out.println(sb);
    }
}

 

ans[arr[i][0]] = rank[i]; 이 부분 조심!!!

시간 초과를 막기 위해 sb를 사용해서 print해야 한다