[BOJ/10825/C++] 국영수

SHark·2023년 5월 2일
0

BOJ

목록 보기
50/59

출처 : https://www.acmicpc.net/problem/10825

문제

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

조건

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

풀이

Sorting을 할 때, Compare함수를 조작할 수 있는지 묻는 문제이다.

#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)

using namespace std;

struct Score
{
  string name;
  int korean;
  int english;
  int math;
};

int N;

Score arr[100001];

bool comp(Score a, Score b)
{
  // 세개의 점수가 다 같다면,
  if (a.korean == b.korean && a.english == b.english && a.math == b.math)
    return a.name < b.name;
  if (a.korean == b.korean && a.english == b.english)
    return a.math > b.math;
  if (a.korean == b.korean)
    return a.english < b.english;
  return a.korean > b.korean;
}
int main()
{
  fastio;
  cin >> N;

  Score tmp;
  for (int i = 0; i < N; i++)
  {
    cin >> tmp.name >> tmp.korean >> tmp.english >> tmp.math;
    arr[i] = tmp;
  }
  sort(arr, arr + N, comp);
  for (int i = 0; i < N; i++)
  {
    cout << arr[i].name << '\n';
  }
  return 0;
}

0개의 댓글