공부용 이모저모
10825번 - 국영수 본문
도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.
- 국어 점수가 감소하는 순서로
- 국어 점수가 같으면 영어 점수가 증가하는 순서로
- 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
- 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
정렬 조건이 꽤 많은데 3회에 걸쳐 정렬하면 너무 오래걸리므로 qsort를 쓰기로 함.
typedef struct Info {
char name[10];
int kor;
int math;
int eng;
}Info;
학생정보를 받는 구조체를 만들고
int Comp(const void* A, const void* B)
{
Info* a, *b;
a = (Info*)A;
b = (Info*)B;
if (a->kor == b->kor)
{
if (a->eng == b->eng)
{
if (a->math == b->math)
{
return strcmp(a->name, b->name);
}
else
return b->math - a->math;
}
else
return a->eng - b->eng;
}
else
return b->kor - a->kor;
}
QSort에 사용할 함수.
매개변수를 const void*로만 받기 때문에 안에서 형변환 해주어야 함.
A가 B보다 클 때 양수가 나오면 오름차순,음수가 나오면 내림차순이다.
문제를 보면 2번에 한해서만 오름차 순이기 때문에 영어점수의 비교구문만 반대로 집어넣었다.
마지막 구문은 strcmp 함수를 사용하면 총합이 더 큰쪽으로 비교해준다.
아래는 전체코드
#include<iostream>
#include <algorithm>
#include <string.h>
using namespace std;
typedef struct Info {
char name[10];
int kor;
int math;
int eng;
}Info;
int Comp(const void* A, const void* B)
{
Info* a, *b;
a = (Info*)A;
b = (Info*)B;
if (a->kor == b->kor)
{
if (a->eng == b->eng)
{
if (a->math == b->math)
{
return strcmp(a->name, b->name);
}
else
return b->math - a->math;
}
else
return a->eng - b->eng;
}
else
return b->kor - a->kor;
}
int main(void) {
cin.tie(0);
ios_base::sync_with_stdio(false);
int t;
cin >> t;
Info *grade = new Info[t];
for (int i = 0; i < t; i++)
cin >> grade[i].name >> grade[i].kor >> grade[i].eng >> grade[i].math;
qsort(grade, t, sizeof(Info), Comp);
for (int i = 0; i < t; i++)
cout << grade[i].name << "\n";
delete[] grade;
return 0;
}
'백준' 카테고리의 다른 글
2914번 - 저작권 (0) | 2021.07.21 |
---|---|
2442번 - 별찍기 5 (0) | 2021.07.15 |
2108번 - 통계학 (0) | 2021.07.07 |