문제 정보: 1983. 조교의 성적 매기기
학점은 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개의 기준 점수를 사용 후 분기 처리)
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
1933. 간단한 N 의 약수 (0) | 2021.08.27 |
---|---|
1859. 백만 장자 프로젝트 (0) | 2021.08.25 |
1204. [S/W 문제해결 기본] 1일차 - 최빈수 구하기 (0) | 2021.08.05 |
1984. 중간 평균값 구하기 (0) | 2021.08.05 |
1926. 간단한 369게임 (0) | 2021.07.28 |