숨막히는 알고말고/문제 풀이

[SWEA] 조교의 성적 매기기(Difficulty 2)

숨숨숨 2021. 1. 21. 00:13

👀 문제 설명

문제

로그인해야 문제를 볼 수 있다

 

✍🏻풀이

성적을 담은 배열 string ans[10] = { "A+", "A0", "A-", "B+", "B0", "B-", "C+", "C0", "C-", "D0" };를 선언한다.

{ 학생의 총점, 몇번째 학생 } 쌍을 담고 있는 벡터 v를 사용해서 구해준다.

모든 학생에 대한 계산이 끝나면, 벡터를 내림차순으로 정렬해준다.

=> vector<pair<double, int>>내림차순으로 정렬하는 법 : sort(v.begin(), v.end(), greater<pair<double, int>>()); 사용. 벡터를 정렬할 때, 내림차순은 greater이다!

 

정렬한 후, for문을 통해 벡터에 접근하여 K번째 학생이 내림차순인 벡터에서 몇번째에 있는지(= j) 구한다. 이 값에 10을 곱한 후, N으로 나눈 값이 ans의 인덱스 값이 된다. 즉, ans[(j * 10) / N]이 답이 된다.

 

코드

#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char** argv) {
    int T;
    cin >> T;
    
    string ans[10] = { "A+", "A0", "A-", "B+", "B0", "B-", "C+", "C0", "C-", "D0" };
    for (int i = 1; i <= T; i++) {
        int N, K;
        cin >> N >> K;
        
        vector<pair<double, int>> v;
        for (int j = 1; j <= N; j++) {
            int first, last, hw;
            double total;
            
            cin >> first >> last >> hw;
            total = first * 0.35 + last * 0.45 + hw * 0.2;
            v.push_back({ total, j });
        }
        
        sort(v.begin(), v.end(), greater<pair<double, int>>());
        
        for (int j = 0; j < v.size(); j++) {
            if (v.at(j).second == K) {
                cout << "#" << i << " " << ans[(j * 10) / N] << endl;
                break;
            }
        }
    }
    
    return 0;
}