[백준] 10825번. 국영수 (C++)
문제 설명
https://www.acmicpc.net/problem/10825
10825번: 국영수
첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1
www.acmicpc.net
해결 방식
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct Student { string name; int Korean; int English; int Math; };
bool compare(Student& st1, Student& st2)
{
if (st1.Korean == st2.Korean && st1.English == st2.English && st1.Math == st2.Math)
{ return st1.name < st2.name; }
else if (st1.Korean == st2.Korean && st1.English == st2.English) { return st1.Math > st2.Math; }
else if (st1.Korean == st2.Korean) { return st1.English < st2.English; }
else { return st1.Korean > st2.Korean; }
}
int main() {
int N;
cin >> N;
vector<Student> students(N);
for (int i = 0; i < N; i++)
{
cin >> students[i].name >> students[i].Korean >> students[i].English >> students[i].Math;
}
sort(students.begin(), students.end(), compare);
for (Student& st : students) { cout << st.name<<"\n"; }
}
struct Student { string name; int Korean; int English; int Math; };
구조체 Student를 만들고 이름, 성적 변수들을 선언했다.
bool compare(Student& st1, Student& st2)
{
if (st1.Korean == st2.Korean && st1.English == st2.English && st1.Math == st2.Math ){ return st1.name < st2.name; }
else if (st1.Korean == st2.Korean && st1.English == st2.English) { return st1.Math > st2.Math; }
else if (st1.Korean == st2.Korean) { return st1.English < st2.English; }
else { return st1.Korean > st2.Korean; }
}
compare 함수를 기준으로 배열을 정렬할 것이다.
sort의 비교 기준이 될 함수는
두개의 인자를 받아서
첫번째 인자 < 두번째 인자 → true를 반환
반대의 경우 false를 반환해야한다.
vector<Student> students(N);
Student 구조체 배열을 만들었다. 크기는 N만큼
for (int i = 0; i < N; i++)
{ cin >> students[i].name >> students[i].Korean >> students[i].English >> students[i].Math; }
배열안의 구조체에 값을 채워넣는다
sort(students.begin(), students.end(), compare);
compare 함수를 기준으로 students 배열을 정렬한다.
for (Student& st : students) { cout << st.name<<"\n"; }
for-each문법으로 출력해주었다.
for(변수 : 배열 혹은 벡터)
배열 혹은 벡터의 값들을 차례로 변수에 담는다. 그리고 그 변수를 출력하는 것이다.