문제
도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.
- 국어 점수가 감소하는 순서로
- 국어 점수가 같으면 영어 점수가 증가하는 순서로
- 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
- 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
접근
국어와 수학은 내림차순, 영어와 이름은 오름차순 정렬이다.
sort는 기본으로 오름차순 정렬이니 국어와 수학점수에 -1을 곱하여 벡터에 넣어 정렬해준다.
점수와 이름을 서로 다른 벡터에 넣는다. 점수는 국, 영, 수 순서로 넣는다.
이름을 먼저 오름차순으로 정렬하고, 점수를 담은 벡터에 그 학생의 이름이 몇번째인지를 추가한다.
점수를 담은 벡터를 정렬하고 이름을 출력한다.
코드
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#include <string>
using namespace std;
int main(){
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int n; cin >> n;
string name;
int k, m, e;
vector<vector<int>> score(n, vector<int>());
vector<pair<string, int>> names;
for(int i=0; i<n; i++){
cin >> name >> k >> e >> m;
score[i].push_back(-1 * k);
score[i].push_back(e);
score[i].push_back(-1*m);
names.push_back(make_pair(name,i));
}
sort(names.begin(), names.end());
for(int i=0; i<n; i++){
score[names[i].second].push_back(i);
}
sort(score.begin(), score.end());
for(int i=0; i<n; i++){
cout << names[score[i][3]].first << "\n";
}
}
풀이
정수형 변수 n을 선언하여 학생의 수를 입력받는다.
학생들의 이름과 점수를 받기 위해 문자열형 변수 name과 정수형 변수 k, m, e를 선언한다.
점수를 담을 2차원 벡터 score와 학생들의 이름을 받을 names를 선언한다.
n번 for문을 돌면서 학생들의 이름을 name에, 국 영 수 점수를 각각 k, m, e에 받는다. 그리고 받은 이름과 몇번째로 입력받은 학생인지를 벡터 names에 넣고 학생들의 점수를 벡터 score에 넣는데 국어와 수학은 내림차순 정렬이니 -1을 곱하여 넣는다(이후에 sort로 정렬할 것이기 때문).
sort함수를 이용하여 벡터 names을 먼저 오름차순으로 정렬한다.
n번 for문을 돌면서 각 학생의 이름이 몇 번째 인지 score에 넣는다.
sort함수를 이용하여 앞의 원소를 기준으로, 앞의 원소가 같으면 뒤의 원소를 기준으로 하여 벡터 score를 정렬한다.
벡터 score의 3번째 인덱스에 학생의 이름이 몇번째로 정렬되어있는지 나와있으므로 이를 인덱스로 사용하여 names에 있는 이름을 출력한다.
알아두자!
2차원 벡터를 선언하고 싶은데 개수를 입력받아 만들어야 한다면, 다음과 같이 동적할당으로 선언하면 된다. vector<vector<자료형>> 벡터이름 (벡터크기, vector<자료형>());
pair의 원소를 가져올 때는 앞의 원소는 first, 뒤의 원소는 second라고 불러서 가져온다.
'Algorithm > c++' 카테고리의 다른 글
| [c++/백준 10828] 스택 (1) | 2023.01.09 |
|---|---|
| [c++/백준 10845] 큐 (1) | 2023.01.09 |
| [c++/백준 10814] 나이순 정렬 (0) | 2023.01.07 |
| [c++/백준 11650] 좌표 정렬하기 (0) | 2023.01.07 |
| [c++/백준 11931] 수 정렬하기 4 (0) | 2023.01.07 |