티스토리 뷰

반응형

학생들의 학점을 매기는 문제

 


문제의 조건

 

1. 학생들의 평가 점수를 담은 1차원 배열 scores가 주어진다. 

 

2. 배열의 행(가로축)에는 열(세로축) 순서로 나열된 학생들이 가로축에 나열된 학생들을 상대로 한 평가임

 

3. 즉 한 학생의 평가점수는 열(세로축) 라인으로 나열되어 있는 점수들임

 

4. 평가점수 중에 유일한 최고점 혹은 최저점이면서 자기 자신이 평가한 점수면 평균을 낼 때 제외함

 

5. 이 때 각 학생들의 평균을 등급을 매겨서 string으로 합쳐서 리턴하기 

 


#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string Evaluate(float score)
{
    if (90 <= score)
        return "A";
    if (80 <= score && 90 > score)
        return "B";
    if (70 <= score && 80 > score)
        return "C";
    if (50 <= score && 70 > score)
        return "D";

    return "F";
}

string solution(vector<vector<int>> scores)
{
    //max_element() 쓸 것이라서 score 행렬 바꿔주기 
    vector<vector<int>> vecRotation(scores.size(), vector<int>(scores.size()));
    for (int i = 0; scores.size() > i; i++)
    {
        for (int j = 0; scores.size() > j; j++)
            vecRotation[i][j] = scores[j][i];
    }

    vector<float> vecAvges;
    for (int i = 0; vecRotation.size() > i; i++)
    {
        int assessment = scores[0].size(); //한 명당 평가한 총 과제 수
        int maxScore = *max_element(vecRotation[i].begin(), vecRotation[i].end());
        int minScore = *min_element(vecRotation[i].begin(), vecRotation[i].end());
        float sum = 0;
        int maxCount = 0, minCount = 0;
        bool maxIsOwn = false, minIsOwn = false;
        for (int j = 0; vecRotation.size() > j; j++)
        {
            sum += vecRotation[i][j];
            //앞서 구한 최고/최저점과 같으면 카운트를 증가시키는데 자기가 평가한 것이면 flag true 변경 
            if (maxScore == vecRotation[i][j])
            {
                maxCount++;
                if (i == j)
                    maxIsOwn = true;
            }

            if (minScore == vecRotation[i][j])
            {
                minCount++;
                if (i == j)
                    minIsOwn = true;
            }
        }
        //최고/최저값이 유일하면서 자기가 평가한 점수면 assessment 감소
        if (maxIsOwn && 1 == maxCount)
        {
            sum -= maxScore;
            assessment--;
        }

        if (minIsOwn && 1 == minCount)
        {
            sum -= minScore;
            assessment--;
        }

        vecAvges.emplace_back(sum/assessment);
    }

    string answer = "";
    for (auto avg: vecAvges)
        answer += Evaluate(avg);

    return answer;
}

 

max_element 함수로 최고점을 구한 다음에 그거랑 비교하는 방식으로 하려 했더니 불가피하게 추가 2차원 배열을 만들게 되었는데요,,,

풀고 나서 다른 분들 풀이 보니까 아주 똑똑하게 추가 메모리 필요 없이 푸신 분들 많더라고용...

나도 좀 더 효율적으로 풀어야지...!!

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함