Softeer - 성적평가 - Java

chaemin·2024년 2월 7일
0

Softeer

목록 보기
1/8

1. 문제

https://softeer.ai/practice/6250

2. 풀이

등수 알고리즘을 많이 찾아봤는데 시간초과(이중반복문)가 날거같아 여러 풀이를 찾다
https://chanheumkoon.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%98%84%EB%8C%80%EC%9E%90%EB%8F%99%EC%B0%A8-Softeer-%EC%84%B1%EC%A0%81%ED%8F%89%EA%B0%80-%ED%92%80%EC%9D%B4
풀이에서 해답을 찾았다.


각 대회에서의 최고점은 PriorityQueue를 사용.
PriorityQueue에서 poll해서 rank[점수] = 등수.

rank[점수] = 등수
점수에 맞는 등수를 한번에 가져올 수 있는 방법 참고.


3. 코드

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

public class Main {

    static int rank[];
    
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        rank = new int[100001];
        int finalScore[] = new int[N];
        PriorityQueue<Integer> PQ = new PriorityQueue<>(Collections.reverseOrder()); // 내림차순

        for(int n = 0; n < 3; n++) {

            Arrays.fill(rank, 1);
            
            int data[] = new int[N];
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");

            for(int i = 0; i < N; i++) {
                int score = Integer.parseInt(st.nextToken());
                data[i] = score;
                PQ.add(score);
                finalScore[i] += score;
            }

            checkRank(PQ);

            for(int i = 0; i < N; i++) {
				// 출력 양식과 똑같아야함
                if(i == N - 1) {
                    System.out.print(rank[data[i]]);
                } else {
                    System.out.print(rank[data[i]] + " ");    
                }
            }
            System.out.println();
        }

        Arrays.fill(rank, 1);
        
        for(int i = 0; i < N; i++) {
            PQ.add(finalScore[i]);
        }

        checkRank(PQ);

        for(int i = 0; i < N; i++) {
            if(i == N - 1) {
                System.out.print(rank[finalScore[i]]);    
            } else {
                System.out.print(rank[finalScore[i]] + " ");    
            }
        }
    }

    public static void checkRank(PriorityQueue<Integer> pq) {
        int beforeScore = 0;
        int count = 0; // 사람 수

        while(!pq.isEmpty()) {
            int nowScore = pq.poll();
            count++; 
            
            // 제일 높은 점수가 1등이니 작은 점수에 대해서 count++된 값을 넣어준다.
            if(nowScore < beforeScore) { 
                rank[nowScore] = count; // 동점자까지 같이 처리됨
            }
            beforeScore = nowScore;
        }
    }
}

0개의 댓글