본문 바로가기

알고리즘 공부 및 문제 풀이/소프티어(SOF)

[sof] 소프티어 <인증평가 5차 기출> 성적 평가 (Java) - 시뮬레이션

[문제]

https://softeer.ai/practice/info.do?idx=1&eid=1309&sw_prbl_sbms_sn=171753 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

[풀이]

문제도 단순하고 풀이도 단순한데 너무 쓸데없이 복잡하게 푼 느낌...

먼저 각 대회마다 모든 참가자들의 점수를 저장해주고 이를 내림차순으로 정렬한다. 그 후 등수를 매기면 된다.

주의할 점은 점수가 같다면 같은 등수를 유지하도록 해야한다는 것.

 

라이브러리에서 가져다 쓴 sort가 시간초과가 나서 직접 정렬을 구현해야 했으면 피곤했을 것 같다.

 

[코드]

 

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


public class Main
{
    static int n;
    public static class Contest{
        int id, score;
        Contest(int id, int score){
            this.id = id;
            this.score = score;
        }
    }
    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        n = Integer.parseInt(br.readLine());
        
        Contest[][] c = new Contest[4][n]; 
        for(int i=0; i<3; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<n; j++){
                c[i][j] = new Contest(j, Integer.parseInt(st.nextToken())); //참가자 번호, 점수
            }
        }

        for(int i=0; i<n; i++){
            int sum = 0;
            for(int j=0; j<3; j++){
                sum += c[j][i].score;
            }
            c[3][i] = new Contest(i, sum);
        }

        //3개의 대회에 대한 등수, 전체 등수 출력
        //성적 순 내림차순 정렬
        for(Contest[] con:c){
            Arrays.sort(con, new Comparator<Contest>(){

                @Override
                public int compare(Contest o1, Contest o2) {
                    // TODO Auto-generated method stub
                    return Integer.compare(o2.score, o1.score);
                }
                
            });
        }

        int[][] r = new int[4][n];
        for(int i=0; i<4; i++){
            int rank = 1;
            int cnt = 1;
            r[i][c[i][0].id] = rank;
            for(int j=1; j<n; j++){
                //점수가 같으면 rank가 같은
                if(c[i][j-1].score == c[i][j].score){
                    r[i][c[i][j].id] = rank;
                    cnt++;
                }
                else {
                    rank += cnt;
                    r[i][c[i][j].id] = rank;
                    cnt = 1;
                }
            }
        }

        for(int i=0; i<4; i++){
            for(int j=0; j<n; j++){
                System.out.print(r[i][j] + " ");
            }
            System.out.println();
        }

    }
}