알고리즘/SW Expert Academy

1983. 조교의 성적 매기기

문제 정보: 1983. 조교의 성적 매기기

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

학점은 A+, A0, A-, B+, B0, B-, C+, C0, C-, D0으로 구성

학생 점수는 중간, 기말, 과제 점수로 구성 (예시 87 59 88 )

총점 = 중간고사 (35%) + 기말고사(45%) + 과제 (20%)

 

10개의 평점을 높은 순서대로 부여 (상대평가)

N 명의 학생이 있을 경우 N/10 명의 학생들에게 동일한 평점을 부여
(예시 10 2는 N=10, 확인하고 싶은 학생은 2번째를 의미 N은 10이므로 1명씩 동일한 학점을 부여)

 

[제약사항]
1. N은 항상 10의 배수이며, 10 이상 100 이하의 정수이다. (10 ≤ N ≤ 100)
2. K는 1 이상 N 이하의 정수이다. (1 ≤ K ≤ N)
3. K 번째 학생의 총점과 다른 학생의 총점이 동일한 경우는 입력으로 주어지지 않는다.

[입력]
입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스의 첫 번째 줄은 학생수 N과, 학점을 알고 싶은 학생의 번호 K 가 주어진다.
테스트 케이스 두 번째 줄부터 각각의 학생이 받은 시험 및 과제 점수가 주어진다.

[출력]
테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

 

입력
10
10 2
87 59 88
99 94 78
94 86 86
99 100 99
69 76 70
76 89 96
98 95 96
74 69 60
98 84 67
85 84 91
출력
#1 A-
...

import java.util.*;

public class solution_1983 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T, stuCnt, searchStu, rangAverage;
        T = sc.nextInt();

        Float[] scoreSortArray = null;
        float[] scoreArray = null;
        float[] scoreRangeArray = null;

        for(int test_case = 0; test_case < T; test_case++) {
            stuCnt = sc.nextInt(); //학생 수
            searchStu = sc.nextInt(); //학점을 알고싶은 학생 범호
            rangAverage = stuCnt / 10;

            if(validCheck(stuCnt, searchStu)){ //제약조건 설정
                return;
            }

            scoreSortArray = new Float[stuCnt];
            scoreArray = new float[stuCnt];
            scoreRangeArray = new float[10];

            for(int i = 0; i < stuCnt; i++){
                for(int j = 0; j < 3; j++) {
                    float score = sc.nextFloat();
                    float percent = 0.2f;
                    if(j == 0) { //중간
                        percent = 0.35f;
                    }else if(j == 1){ //기말
                        percent = 0.45f;
                    }
                    scoreArray[i] += score * percent; //점수 입력
                    scoreSortArray[i] = scoreSortArray[i] != null ? scoreSortArray[i] + (score * percent) : (score * percent);
                }
            }

            //정렬 후 기준점수 저장
            Arrays.sort(scoreSortArray, Comparator.reverseOrder());
            for(int j = 1; j <= scoreRangeArray.length; j++) {
                scoreRangeArray[j-1] = scoreSortArray[(rangAverage * j) - 1];
            }

            System.out.println("#" + (test_case+1) + " " + resultReturn(scoreArray[searchStu-1], scoreRangeArray));
        }
    }

    public static boolean validCheck(int stuCnt, int searchStu){
        if(stuCnt % 10 != 0 || stuCnt < 10 || stuCnt > 100){
            return true;
        }else if(searchStu < 1 || searchStu > stuCnt){
            return true;
        }
        return false;
    }

    public static String resultReturn(float stuScore, float[] scoreRangeArray){
        String result = "";

        if(stuScore >= scoreRangeArray[0]){
            result = "A+";
        }else if(stuScore >= scoreRangeArray[1]){
            result = "A0";
        }else if(stuScore >= scoreRangeArray[2]){
            result = "A-";
        }else if(stuScore >= scoreRangeArray[3]){
            result = "B+";
        }else if(stuScore >= scoreRangeArray[4]){
            result = "B0";
        }else if(stuScore >= scoreRangeArray[5]){
            result = "B-";
        }else if(stuScore >= scoreRangeArray[6]){
            result = "C+";
        }else if(stuScore >= scoreRangeArray[7]){
            result = "C0";
        }else if(stuScore >= scoreRangeArray[8]){
            result = "C-";
        }else{
            result = "D0";
        }

        return result;
    }
}

생각하는데 시간이 걸린 부분

  • 학생에 총점을 구하는 부분 (Float는 null이 허용)
  • K번째 학생에 총점을 N/10을 통해 어느 학점인지 알 수 있는 부분 (10개의 기준 점수를 사용 후 분기 처리)