SWEA/[D2]

[C언어] SWEA 1983 조교의 성적 매기기

ruming 2020. 8. 30. 23:15

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문제처럼 동적할당을 너무 많이쓰니까 코드가 지저분한 것 같아서 쓰지 않았다. 이번 문제는 푸는 방법이 여러가지일 것 같아 방법을 더 찾아봐야 할 것 같다. 


https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PwGK6AcIDFAUq&categoryId=AV5PwGK6AcIDFAUq&categoryType=CODE

 

SW Expert Academy

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

swexpertacademy.com