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;
}