Algorithm/Softeer
[HSAT 5회 정기 코딩 인증평가 기출] 성적 평가
48965
2024. 3. 20. 21:02
풀이
정렬 알고리즘의 응용 문제였다. 구현의 핵심은 역순 정렬 후 중복되는 값을 처리하는 로직이었는데, 처음에 count 함수를 사용해서 중복처리 로직설계를 진행하였다가 시간초과가 발생하였다. 이후에 rank라는 포인터를 지정 후 이를 사용하여 중복되는 숫자에 대해 처리를 해주니 시간초과 문제가 해결되었다.
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int N;
vector<pair<int, int>> vec[4];
int order[4][100001];
int main(int argc, char** argv) {
cin >> N;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < N; j++) {
int score;
cin >> score;
vec[i].push_back({score,j});
}
}
for (int j = 0; j < N; j++) {
int sum = 0;
for (int i = 0; i < 3; i++) {
sum += vec[i][j].first;
}
vec[3].push_back({sum,j});
}
for (int i = 0; i < 4; i++) {
sort(vec[i].rbegin(),vec[i].rend());
int rank = 1;
for (int j = 0; j < N; j++) {
if (j > 0 && vec[i][j].first < vec[i][j - 1].first) {
rank = j + 1;
}
order[i][vec[i][j].second] = rank;
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < N; j++) {
cout << order[i][j] << " ";
}
cout << "\n";
}
return 0;
}