학기가 끝나고, 학생들의 점수로 학점을 계산중이다.
학점은 상대평가로 주어지는데, 총 10개의 평점이 있다.
학점은 학생들이 응시한 중간/기말고사 점수 결과 및 과제 점수가 반영한다.
각각 아래 비율로 반영된다.
10 개의 평점을 총점이 높은 순서대로 부여하는데,
각각의 평점은 같은 비율로 부여할 수 있다.
예를 들어, N 명의 학생이 있을 경우 N/10 명의 학생들에게 동일한 평점을 부여할 수 있다.
입력으로 각각의 학생들의 중간, 기말, 과제 점수가 주어지고,
학점을 알고싶은 K 번째 학생의 번호가 주어졌을 때,
K 번째 학생의 학점을 출력하는 프로그램을 작성하라.
[제약사항]
1. N은 항상 10의 배수이며, 10이상 100이하의 정수이다. (10 ≤ N ≤ 100)
2. K는 1 이상 N 이하의 정수이다. (1 ≤ K ≤ N)
3. K 번째 학생의 총점과 다른 학생의 총점이 동일한 경우는 입력으로 주어지지 않는다.
[입력]
입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스의 첫 번째 줄은 학생수 N 과, 학점을 알고싶은 학생의 번호 K 가 주어진다.
테스트 케이스 두 번째 줄 부터 각각의 학생이 받은 시험 및 과제 점수가 주어진다.
[출력]
테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
10 2
87 59 88
99 94 78
94 86 86
99 100 99
69 76 70
76 89 96
98 95 96
74 69 60
98 84 67
85 84 91
…
• 풀이
map 2개나
map + vector로 입력받은 순서와 해당 순서의 값이 전체에서 몇등인지를 저장하는 방법은 알고 있었는데
차등으로 성적을 줘야되서 골아팠다...
먼저 순서, 값 형태로 맵에 값을 저장하고
vector에도 값을 넣어준다음 내림차순 정렬하고
값, 순서 맵에 vector의 차례대로 값을 넣어서 해당 값이 전체에서 몇등인지를 저장한 다음
등수를 구했다... 이렇게까지 들어가니까 어질어질한데 더 열심히 해보자
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
string grades[] = { "A+", "A0", "A-", "B+", "B0", "B-", "C+", "C0", "C-", "D0" };
int test_case;
cin >> test_case;
for(int t = 1; t <= test_case; t++) {
int n, num;
cin >> n >> num;
map<double, int> grade;
map<int, double> score;
vector<double> arr(n);
for(int i = 0; i < n; i++) {
int mid, final, subject;
cin >> mid >> final >> subject;
double tmp = (mid * 35 + final * 45 + subject * 20) / 300.0;
arr[i] = tmp; //점수 벡터에 점수 저장
score[i + 1] = tmp; // 순서 맵에 들어온 순서대로 점수 저장
}
sort(arr.begin(), arr.end(), greater<>());
for(int i = 0; i < n; i++) {
grade[arr[i]] = i + 1; // 점수 내림차순으로 등급 부여
}
// score[num]은 num번째 들어온 사람의 점수를 가져옴
//grade[score[num]]은 그 사람의 점수로 몇등인지를 가져옴
//grades[몇등]을 10명만 하면 깔끔하겠지만 그렇지 않기에 / (n/10)까지 해준다
// n번째 온사람이 몇점이고, 그 점수면 몇등인지까지를 구해서 grades[등수]로 등급을 구하는 방식
cout << "#" << t << " " << grades[(grade[score[num]] - 1) / (n / 10)] << '\n';
}
}
'C++ 알고리즘' 카테고리의 다른 글
1244. swea 최대 상금 D3 (0) | 2024.10.14 |
---|---|
1206. [S/W 문제해결 기본] 1일차 - View D3 (1) | 2024.10.14 |
1288. 새로운 불면증 치료법 D2 (1) | 2024.10.12 |
SWEA D2 1959. 두 개의 숫자열 (0) | 2024.10.12 |
SWEA D2 1961. 숫자 배열 회전 (4) | 2024.10.11 |