문제
Softeer Lv3 : 성적 평가 – https://softeer.ai/practice/6250
알고리즘
Input: 참가자의 수(N), 각 대회의 점수
- 대회별 등수 계산
1.1. 점수를 내림차순으로 정렬
1.2. 등수 계산- 동점인 경우 같은 등수
- (나보다 점수가 높은 사람 + 1)등
- 참가자별 세 대회의 점수를 합산
- 최종 등수 계산
3.1. 점수를 내림차순으로 정렬
3.2. 등수 계산- 동점인 경우 같은 등수
- (나보다 점수가 높은 사람 + 1)등
Output: 각 대회별 등수, 최종 등수
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <stdio.h> #include <stdlib.h> typedef struct { int score; /* 점수 */ int index; /* 인덱스(참가자) */ } Rank; /* Func: 점수를 기준으로 내림차순 정렬 */ int compare( const void *a, const void *b) { return ((Rank *)b)->score - ((Rank *)a)->score; } /* Func: 대회별 등수 계산 */ void calculate_rank( int scores[], int ranks[], int N) { Rank *ranking = (Rank *) malloc (N * sizeof (Rank)); for ( int i = 0; i < N; i++) { ranking[i].index = i; ranking[i].score = scores[i]; } /* 1.점수를 내림차순으로 정렬 */ qsort (ranking, N, sizeof (Rank), compare); /* 2.등수 계산 */ for ( int i = 0; i < N; i++) { if (i > 0 && ranking[i].score == ranking[i - 1].score) ranks[ranking[i].index] = ranks[ranking[i - 1].index]; /* 2.1.동점인 경우 같은 등수 */ else ranks[ranking[i].index] = i + 1; /* 2.2.(나보다 점수가 높은 사람 + 1)등 */ } free (ranking); } int main() { /* Input: 참가자의 수 */ int N; scanf ( "%d" , &N); int scores[3][N]; int ranks[3][N]; int total_scores[N]; int total_ranks[N]; /* Input: 각 대회의 점수 */ for ( int i = 0; i < 3; i++) for ( int j = 0; j < N; j++) scanf ( "%d" , &scores[i][j]); /* 1.대회별 등수 계산 */ for ( int i = 0; i < 3; i++) calculate_rank(scores[i], ranks[i], N); /* 2.참가자별 세 대회의 점수를 합산 */ for ( int i = 0; i < N; i++) total_scores[i] = scores[0][i] + scores[1][i] + scores[2][i]; /* 3.최종 등수 계산 */ calculate_rank(total_scores, total_ranks, N); /* Output: 각 대회별 등수 */ for ( int i = 0; i < 3; i++) { for ( int j = 0; j < N; j++) { printf ( "%d " , ranks[i][j]); } printf ( "\n" ); } /* Output: 최종 등수 */ for ( int i = 0; i < N; i++) printf ( "%d " , total_ranks[i]); return 0; } |