ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA] 1983. 조교의 성적 매기기 c++
    Coding Test/SW Expert Academy 2022. 11. 15. 17:02
    728x90
    • 문제

    ※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.


    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 가 주어진다.

    테스트 케이스 두 번째 줄 부터 각각의 학생이 받은 시험 및 과제 점수가 주어진다.


     

     

    • 문제 해결

    1. 이 문제는 주어진 데이터의 index가 학생의 번호이므로 저장해야한다.

       <index, score> 쌍을 만들어 저장한다.

    2. socre순으로 내림차순 정렬해야 한다.

       pair.second 기준으로 정렬해야 하므로 sort함수의 비교 함수인 cmp를 만들어 cmp 함수 기준으로 정렬되도록 한다.

    3. 정렬된 벡터에서 k번 학생을 찾고 해당 index의 rank를 구한다.

    4. 10명 중 5등 : B0

        20명 중 5등 : A-

        위 사항에 따른 rank 계산을 해야한다.

        30명 : a+  1, 2, 3
                   a0  4, 5, 6
                   a-   7, 8, 9

        40명 : a+ 1 ,2 ,3 ,4
                  a0  5, 6, 7, 8
                  a-  9 ,10, 11, 12

        →   위 패턴을 보고 rank 계산식을 만들었다.

                

               30명, cnt = 3

               40명, cnt = 4

              각 rank는 cnt개씩이다. 또한, 각 rank의 cnt번째는 cnt의 배수이다.

              (배수는 나머지가 0인 것을 이용할 수 있다.)

               

       →   index 를 cnt로 나눈 나머지가 0이라면 index/cnt 가 rank이다.

              0이 아니라면, index/cnt + 1이 rank이다.

     

    #include<iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    bool cmp(pair<int, double>& a, pair<int, double>& b){
        return a.second > b. second;
    }
    
    int main(int argc, char** argv)
    {
    	int test_case;
    	int T;
    	
    	cin>>T;
    	
    	for(test_case = 1; test_case <= T; ++test_case)
    	{
    		int n = 0, k = 0;
            cin >> n >> k;
            
            vector<pair<int, double>> vec;
            for(int i = 0; i < n; i++){
            	int a = 0, b = 0, c = 0;
                cin >> a >> b >> c;
                vec.push_back( { i + 1, a * 0.35 + b * 0.45 + c * 0.2} );
            }
            sort(vec.begin(), vec.end(), cmp);
            int cnt = n / 10;
    		
            int rank = 0;
           for(int i = 1; i <= n; i++){
           		if( vec[i-1].first == k){
    				rank = i % cnt != 0 ? i / cnt + 1 : i / cnt;
                    break;
                }
           }
           cout << "#" << test_case << " " ;
     	switch(rank){
            case 1:{
            	cout << "A+" << endl;
                break;
            }
            case 2:{
                cout << "A0" << endl;
                break;
            }
            case 3:{
                cout << "A-" << endl;
                break;
            }
            case 4:{
                cout << "B+" << endl;
                break;
            }
            case 5:{
                cout << "B0" << endl;
                break;
            }
            case 6:{
                cout <<  "B-" << endl;
                break;
            }
            case 7:{
                cout <<"C+" << endl;
                break;
            }
            case 8:{
                cout << "C0" << endl;
                break;
            }
            case 9:{
                cout <<"C-" << endl;
                break;
            }
            case 10:{
                cout << "D0" << endl;
                break;
            }
        }
            
    	}
    	return 0;
    }
    728x90

    댓글

© 2022. code-space ALL RIGHTS RESERVED.