컴공 일기212
게시글 주소: https://orbi.kr/00060980166
BaekJoon 10825번 국영수 문제 - Sorting Algorithm
도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.
1. 국어 점수가 감소하는 순서로
2. 국어 점수가 같으면 영어 점수가 증가하는 순서로
3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
백준 10825번 국영수 문제 난도는 silver4 즈음 되는 군요.
기본적으로 sort 함수를 이용한 정렬 문제이므로, 정렬 조건을 만족하는 compare 함수를 만드는 것이 관건입니다.
그것만 만들면... 쉽게 접근해 볼 수 있지요. 다만, 개인적으로 call back 구조가 사용되고 있으니 비동기 처리를 하고 있음을 체크하는 것이 중요하다고 생각되네요.
흐.. 콜백 구조는 예제로 보면 굉장히 쉬워보이는 기법인데, 막상 실제로 적재적소에 쓰라고 한다면 머리를 쥐어짜게 되더라구요.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct student {
string name;
int kor, eng, math;
};
bool Compare(student a, student b)
{
if (a.kor == b.kor && a.eng == b.eng && a.math == b.math) return a.name < b.name;
if (a.kor == b.kor && a.eng == b.eng) return a.math > b.math;
if (a.kor == b.kor) return a.eng < b.eng;
//만약 국어 점수가 같지 않은 상태라면
return a.kor > b.kor;
}
int main()
{
int N;
int i;
cin >> N;
vector<student> v(N);
for (int i = 0; i < N; i++)
cin >> v[i].name >> v[i].kor >> v[i].eng >> v[i].math;
sort(v.begin(), v.end(), Compare);
//endl 대신 '\n'을 사용하는 이유는 연산 시간을 최소화 하기 위함이다. endl는 buffer를 다 비워내고 출력하기 때문에, '\n'보다는 느리다. 둘 다 써도 무방하지만, endl를 사용하면 시간 초과가 돼서 오답 처리가 된다.
for (i = 0; i < N; i++)
cout << v[i].name << '\n';
return 0;
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
기생충 영화 처음 봤을때 느낌이 드네요... 되게 참 뭐랄까 야하거나 폭력적이다라고...
-
혼란하다 혼란해
첫번째 댓글의 주인공이 되어보세요.