문제
Softeer Lv3 : 성적 평가 – https://softeer.ai/practice/6250
알고리즘
Input: 참가자의 수(N), 각 대회의 점수
- 대회별 등수 계산
1.1. 점수를 내림차순으로 정렬
1.2. 등수 계산- 동점인 경우 같은 등수
- (나보다 점수가 높은 사람 + 1)등
- 참가자별 세 대회의 점수를 합산
- 최종 등수 계산
3.1. 점수를 내림차순으로 정렬
3.2. 등수 계산- 동점인 경우 같은 등수
- (나보다 점수가 높은 사람 + 1)등
Output: 각 대회별 등수, 최종 등수
소스코드
#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;
}