본문 바로가기
코딩테스트 준비/소프티어

[소프티어] 6250번 - 성적 평가 [Java]

by mwzz6 2025. 2. 6.

https://softeer.ai/practice/6250

 

[소프티어] 6250번 - 성적 평가 [Java]
[소프티어] 6250번 - 성적 평가 [Java]
[소프티어] 6250번 - 성적 평가 [Java]


1.  아이디어

 

참가자의 각 대회에서 등수와 모든 대회의 점수의 합의 등수를 출력해야하는 문제다. 참가자 번호, 참가자 점수, 참가자 등수를 필드로 갖는 클래스와 정렬을 통해 해결했다.


2. 문제풀이

 

주어진 입력값을 받은 후 이를 참가자의 3가지 정보를 갖는 노드 배열로 반환하는 init 메서드를 활용했다. 노드 배열은 입력으로 참가자 번호와 참가자 점수는 알 수 있으므로 참가자 점수로 정렬을 해서 참가자의 등수를 구했고 이를 다시 참가자 번호로 정렬해서 원래 순서를 유지하도록 했다.


3. 코드

 

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

public class Main {

    private static class Node {
        // 참가자 번호
        int person;
        // 참가자 점수
        int num;
        // 참가자 등수
        int order;

        public Node(int person, int num) {
            this.person = person;
            this.num = num;
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

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

        int[][] map = new int[3][N];
        int[] total = new int[N];

        for (int i = 0; i < 3; i++) {
            st = new StringTokenizer(br.readLine());

            for (int j = 0; j < N; j++) {
                int num = Integer.parseInt(st.nextToken());
                map[i][j] = num;
                total[j] += num;
            }
        }

        for (int i = 0; i < 3; i++) {
            Node[] arr = init(N, map[i]);

            for (Node node : arr) {
                sb.append(node.order).append(" ");
            }
            sb.append("\n");
        }

        Node[] arr = init(N, total);
        for (Node node : arr) {
            sb.append(node.order).append(" ");
        }
        sb.append("\n");

        bw.write(sb.toString());
        bw.flush();
    }

    private static Node[] init(int N, int[] arr) {
        Node[] nodeArr = new Node[N];

        for (int i = 0; i < N; i++) {
            nodeArr[i] = new Node(i, arr[i]);
        }

        Arrays.sort(nodeArr, (o1, o2) -> Integer.compare(o2.num, o1.num));

        int before = nodeArr[0].num;
        nodeArr[0].order = 1;
        for (int i = 1; i < N; i++) {
            if (nodeArr[i].num == before) nodeArr[i].order = nodeArr[i - 1].order;
            else nodeArr[i].order = i + 1;

            before = nodeArr[i].num;
        }

        Arrays.sort(nodeArr, (o1, o2) -> Integer.compare(o1.person, o2.person));

        return nodeArr;
    }

}

4. 후기