N명의 학생에게 성적을 줘야 함. (성적 종류는 A+, A0, A-, B+, ..., C-, D0로 10개)
제한 : N은 10의 배수, N/10만큼 같은 성적을 줄 수 있음
예) N이 20이면 A+, A0 ... 을 각각 두개씩 줄 수 있음 (총 20명이므로 10*2)
k번째 학생의 성적을 출력하는 것이 목표
제한 : k는 다른 점수와 같은 점수로 주지 않음
#include <stdio.h>
#include <stdlib.h>
int main(void){
int T, t, i, n, k, j;
int score[100], sGrade[100];
char grade[10][3] = {"A+","A0","A-","B+","B0","B-","C+","C0","C-","D0"};
int s1, s2, s3;
scanf("%d", &T);
for(t=1; t<=T; t++){
scanf("%d%d", &n, &k);
for(i=0; i<n; i++){
scanf("%d%d%d", &s1, &s2, &s3);
score[i] = s1*35 + s2*45 + s3*20;
}
int temp;
for(i=0; i<n; i++) sGrade[i] = score[i];
for(i=0; i<n; i++){
for(j=0; j<n-1; j++){
if(sGrade[j] < sGrade[j+1]){
temp = sGrade[j+1];
sGrade[j+1] = sGrade[j];
sGrade[j] = temp;
}
}
}
int k_rank = 0;
for(i=0; i<n; i++){
if(sGrade[i] == score[k-1]){
k_rank++;
break;
}
k_rank++;
}
printf("#%d %s\n", t, grade[(k_rank-1)/(n/10)]);
}
return 0;
}
score에 중간, 기말, 수행이 각각 35%, 45%, 20%의 비율로 계산한 값을 저장했는데, 100으로 나누니까 동점이 너무 많아져서 100을 나누지 않고 각 수를 곱한 값을 더해 그냥 저장했다. sGrade라는 배열을 만들어서 score를 그대로 저장하고 버블정렬로 내림차순으로 정렬했다. 등수를 알아내기 위해 생각해낸 방법인데 다른 방법이 생각날 듯 말듯 안났다.
C에서 정렬함수를 제공하는 게 있나 싶어서 찾아봤는데 stdlib.h를 포함하면 qsort함수를 쓸 수 있는 것 같다. 근데 설명 읽고 쓸 시간이 없어서 그냥 버블정렬 썼다.
*qsort 찾아보기
k 학생의 등수를 저장하기 위해 k_rank 변수를 만들고 for문을 돌려 sGrade값과 score값이 일치할때까지 +1해서 저장했다. 그냥 k_rank = i+1;로 저장해도 되는데 score[k-1]로 안쓰고 score[k]로 쓰는 바람에 틀린 곳 찾느라 하나씩 일일이 더했다. 출력할 때는 인덱스값을 생각해 -1하고 n/10으로 나눴다. 맞게 나오긴 했는데 대충 생각하고 쓴거라 어디에서 -1을 해야되는지 좀 헷갈렸다. 저장할 때 k_rank = i;로 저장하면 조금 더 간단한 코드가 된다.
아 그리고 처음에 score랑 sGrade도 동적할당으로 받고 싶었는데 1979문제처럼 동적할당을 너무 많이쓰니까 코드가 지저분한 것 같아서 쓰지 않았다. 이번 문제는 푸는 방법이 여러가지일 것 같아 방법을 더 찾아봐야 할 것 같다.
'SWEA > [D2]' 카테고리의 다른 글
[C언어] SWEA 1946 간단한 압축 풀기 (0) | 2022.02.26 |
---|---|
[C언어] SWEA 1976 시각 덧셈 (0) | 2022.02.26 |
[C언어] SWEA 1979 어디에 단어가 들어갈 수 있을까 (0) | 2020.08.30 |
[C언어] SWEA 1959 두 개의 숫자열 (0) | 2020.08.23 |
[C언어] SWEA 1966 숫자를 정렬하자 (0) | 2020.08.20 |