SWEA - 조교의 성적 매기기(1983)
문제
학기가 끝나고, 학생들의 점수로 학점을 계산중이다.
학점은 상대평가로 주어지는데, 총 10개의 평점이 있다.
학점은 학생들이 응시한 중간/기말고사 점수 결과 및 과제 점수가 반영한다.
각각 아래 비율로 반영된다.
10 개의 평점을 총점이 높은 순서대로 부여하는데,
각각의 평점은 같은 비율로 부여할 수 있다.
예를 들어, N 명의 학생이 있을 경우 N/10 명의 학생들에게 동일한 평점을 부여할 수 있다.
입력으로 각각의 학생들의 중간, 기말, 과제 점수가 주어지고,
학점을 알고싶은 K 번째 학생의 번호가 주어졌을 때,
K 번째 학생의 학점을 출력하는 프로그램을 작성하라.
[제약사항]
1. N은 항상 10의 배수이며, 10이상 100이하의 정수이다. (10 ≤ N ≤ 100)
2. K는 1 이상 N 이하의 정수이다. (1 ≤ K ≤ N)
3. K 번째 학생의 총점과 다른 학생의 총점이 동일한 경우는 입력으로 주어지지 않는다.
접근 방식
grades 배열에 학점 나열
학생 수 N명과 K번 째 학생을 입력받고, avg_arr = []로 선언
학생 수가 N명이므로 for문을 N번 돌면서 중간, 기말, 과제 점수를 scores에 리스트로 받음
중간이 35%, 기말이 45%, 과제가 20%이므로 avg_arr에 각각 퍼센테이지를 곱한 값을 더해줌
K번째 학생이 무슨 학점인지 알아내야하는문제이므로 k번째 학생의 점수를 kth_score에서 받아줌
avg_arr에 순서대로 학생들의 평균이 입력되어있는데 학점을 높은 순서대로 나열했으므로(A+, A0, A-, ...) avg_arr를 값이 높은 순서대로 나열해줌
그리고 가장 해결하는 데 오래걸렸던 부분(학생 수가 10명이면 각 학점에 1명씩, 20명이면 각 학점에 2명씩 들어가는 부분)인데, div라는 변수를 선언하고 N // 10으로 선언해줌(ex: N = 30이면 div = 30 // 10 = 3)
그리고 avg_arr.index(kth_score)를 통해 정렬한 avg_arr에서 K번째 학생의 점수값을 index로 넣어서 K번째 학생의 점수가 내림차순으로 정렬했을 때 몇 번째에 해당하는지 확인하고 그 값을 div로 나눠줌(학생이 30명이고 K번째 학생의 평균점수가 90이고 내림차순으로 정렬했을 때 avg_arr의 4번째에 있으면 avg_arr.index(kth_score) // div = 4 // 3 = 1이 됨. 이 값을 kth_grade에 할당해주고 grades[kth_score]하면 grades[1]이 되므로 A0가 나옴. 30명 중 4등이므로 3등까지 A+, 4~6등은 A0를 받음)
코드
T = int(input())
grades = ['A+', 'A0', 'A-', 'B+', 'B0', 'B-', 'C+', 'C0', 'C-', 'D0']
for i in range(1, T+1):
N, K = map(int, input().split())
avg_arr = []
for _ in range(N):
scores = list(map(int, input().split()))
avg_arr.append(scores[0] * 0.35 + scores[1] * 0.45 + scores[2] * 0.2)
kth_score = avg_arr[K-1]
avg_arr.sort(reverse=True)
div = N // 10
kth_grade = avg_arr.index(kth_score) // div
print('#'+str(i), grades[kth_grade])