Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

공부용 이모저모

10825번 - 국영수 본문

백준

10825번 - 국영수

불타는버스 2021. 7. 6. 11:48

도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.

  1. 국어 점수가 감소하는 순서로
  2. 국어 점수가 같으면 영어 점수가 증가하는 순서로
  3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
  4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)

 

정렬 조건이 꽤 많은데 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