728x90
반응형
1. 문제
https://softeer.ai/practice/info.do?idx=1&eid=1309&sw_prbl_sbms_sn=143186
2. 알고리즘 분류
- 정렬
3. 소스 코드
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<int, int>> scores[4];
vector<pair<int, int>> total_scores;
vector<int> result;
int main(int argc, char** argv)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// input
int N;
cin >> N;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < N; j++) {
int score;
cin >> score;
scores[i].push_back({ score, j }); // score와 인덱스 값을 저장
}
}
// 최종 점수 합산
for (int i = 0; i < N; i++) {
scores[3].push_back({ 0, i });
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < N; j++) {
int score = scores[i][j].first;
int index = scores[i][j].second;
scores[3][index].first += score;
}
}
// 순위를 저장할 vector 선언
for (int i = 0; i < N; i++)
result.push_back(0);
// 1. 점수를 오름차순으로 정렬
// 2. 오름차순 정렬된 vector를 확인하면서 등수 선정
for (int i = 0; i < 4; i++) {
sort(scores[i].begin(), scores[i].end(), greater<>()); // 점수 오름차순으로 정렬
// 공동 순위 파악을 위해 이전 점수와 등수 체크
int prev_score = scores[i][0].first;
int prev_rank = 1;
// 오름차순 정렬된 vector 확인하면서 등수 체크
for (int j = 0; j < N; j++) {
int score = scores[i][j].first;
int idx = scores[i][j].second;
int rank = j + 1;
// 점수가 같다면, 공동 순위
if (score == prev_score) {
rank = prev_rank;
result[idx] = rank;
}
else {
result[idx] = rank;
prev_rank = rank;
}
prev_score = score;
}
for (int j = 0; j < N; j++) {
cout << result[j] << " ";
}
cout << "\n";
}
return 0;
}
4. 유용한 문법 및 알고리즘
4-1) sort를 통한 오름차순 정렬
include <vector>
sort(scores[i].begin(), scores[i].end(), greater<>()); // 점수 오름차순으로 정렬
728x90