난이도 : D2
문제번호 : 1983
※ 저의 풀이가 무조건적인 정답은 아닙니다.
다른 코드가 좀더 효율적이고 좋을 수 있습니다.
다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.
문제 주소 및 출처입니다.
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
3.1 주석 없는 코드
3.2 주석 있는 코드
4. 결과
1. 문제 설명
학기가 끝나고, 학생들의 점수로 학점을 계산중이다.
A+ A0 A- B+ B0 B- C+ C0 C- D0
학점은 학생들이 응시한 중간/기말고사 점수 결과 및 과제 점수가 반영한다.
총점 = 중간고사(35%) + 기말고사 (45%) + 과제 (20%)
10 개의 평점을 총점이 높은 순서대로 부여하는데, |
제약사항
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 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 … |
#1 A- ... |
2. 문제풀이
막혔던 부분은 오름차순정렬과 등수에따른 성적매기기 였습니다. 등수에 따른 성적은 처음에는 단순하게 학생번호 / 총학생수 로 나눴는데 생각해보니 제일마지막 학생이 아닌이상 전부다 0이 되더라구요. 그래서 *10을 해서 문제를 해결햇습니다. ex) 3등이고 총인원 10명이면 -> 30/10 -> 3번째등급
내림차순 정렬을 하기위해 처음에는 sort(begin, end, greater)를 사용했습니다. 그런데 컴파일이 안되더라구요 그래서 비교함수를 만들어서 sort(begin, end, cmp)로 했는데 역시 안됬습니다. 그래서 어쩔수없이 오름차순 정렬을 한번하고 뒤집는 함수를 이용했습니다.
(그냥 오름차순 정렬을 해서 뒤에서 빼는 방법도 있습니다. 예를 들어서 총인원이 10명인데 오름차순 1등이면 10-0 이니까 꼴등입니다.)
(혹은 자체적으로 정렬함수를 만드는 방법도 있습니다. 퀵정렬이라던가, 버블정렬이라던가...) |
3. 소스코드
3.1 주석없는 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int length;
string answer[10]{ "A+", "A0", "A-" , "B+", "B0", "B-", "C+", "C0", "C-", "D0" };
cin >> length;
for (int i = 1; i <= length; i++) {
int grade[3], n, k;
vector<pair<double, int> > student;
cin >> n >> k;
for (int z = 0; z < n; z++) {
for (int j = 0; j < 3; j++)
cin >> grade[j];
student.push_back(make_pair(grade[0] * 0.35 + grade[1] * 0.45 + grade[2] * 0.2, z));
}
sort(student.begin(), student.end());
reverse(student.begin(), student.end());
for (int j = 0; j < student.size(); j++) {
if (student[j].second == k-1)
cout << "#" << i << " " << answer[(j*10) / student.size()] << endl;
}
}
return 0;
}
|
3.2 주석있는 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
//총 반복 횟수
int length;
//성적에 따른 등급
string answer[10]{ "A+", "A0", "A-" , "B+", "B0", "B-", "C+", "C0", "C-", "D0" };
cin >> length;
for (int i = 1; i <= length; i++) {
//성적 ,총학생수, 학생번호
int grade[3], n, k;
//학생 번호하고 성적을 저장하기위한 vector
vector<pair<double, int> > student;
cin >> n >> k;
//성적 입력받기
for (int z = 0; z < n; z++) {
for (int j = 0; j < 3; j++)
cin >> grade[j];
//성적에 따른 총성적과 학생번호 등록
student.push_back(make_pair(grade[0] * 0.35 + grade[1] * 0.45 + grade[2] * 0.2, z));
}
//정렬하기(내림차순 정렬이 Gcc 4.8.5버전에서 되지않아서 reverse사용)
sort(student.begin(), student.end());
reverse(student.begin(), student.end());
for (int j = 0; j < student.size(); j++) {
if (student[j].second == k-1)//그냥 나누면 0~1사이이기때문에 *10을해서 나눠준다.
cout << "#" << i << " " << answer[(j*10) / student.size()] << endl;
}
}
return 0;
}
|
4. 결과
'코딩테스트 > SWExpertAcademy' 카테고리의 다른 글
어디에 단어가 들아갈 수 있을까 C++(SW Expert Academy) (0) | 2020.02.06 |
---|---|
파스칼삼각형 C++,Python(SW Expert Academy) (0) | 2020.02.05 |
간단한 369게임 C++(SW Expert Academy) (0) | 2020.02.04 |
파리 퇴치 C++, Python(SW Expert Academy) (0) | 2019.11.21 |
백만장자 프로젝트 C++(SW Expert Academy) (0) | 2019.11.19 |
댓글