코딩테스트/SWExpertAcademy

조교의 성적 매기기 C++(SW Expert Academy)

멍토 2019. 11. 21.

난이도 : D2

문제번호 : 1983

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소 및 출처입니다.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PwGK6AcIDFAUq&categoryId=AV5PwGK6AcIDFAUq&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


목차

1. 문제 설명

2. 문제 해석

3. 소스 코드

3.1 주석 없는 코드

3.2 주석 있는 코드

4. 결과

 


1. 문제 설명

학기가 끝나고, 학생들의 점수로 학점을 계산중이다.

학점은 상대평가로 주어지는데, 총 10개의 평점이 있다.

 

A+ A0 A- B+ B0 B- C+ C0 C- D0

 

학점은 학생들이 응시한 중간/기말고사 점수 결과 및 과제 점수가 반영한다.

각각 아래 비율로 반영된다.

 

총점 = 중간고사(35%) + 기말고사 (45%) + 과제 (20%)

 

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
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<doubleint> > 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<doubleint> > 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. 결과

댓글

💲 광고입니다.