숨막히는 알고말고/문제 풀이
[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;
}