GitHubSeob

C++ / 프로그래머스 / 위클리 챌린지 2주차 / 상호 평가 본문

Programmers/Level 1

C++ / 프로그래머스 / 위클리 챌린지 2주차 / 상호 평가

GitHubSeob 2021. 8. 11.

문제

https://programmers.co.kr/learn/courses/30/lessons/83201

 

코딩테스트 연습 - 2주차

[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]] "FBABD" [[70,49,90],[68,50,38],[73,31,100]] "CFD"

programmers.co.kr

 

문제풀이

자기 점수를 제외한 점수들만 sum에 점수를 누적한다.

자기 점수가 유일한 최고점 또는 최저점이면 sum에 있는 점수 / (학생수-1)를 하여 평균 벡터인 avg에 저장한다.

자기 점수가 유일한 최고점 또는 최저점이 아니면 sum에 자기 점수를 더하고 학생수만큼 나누어 avg에 저장한다.

자기 점수가 유일한 점수인지는 자기 점수를 제외한 최고점, 최저점을 구하고 자기 점수와 비교하면 된다.

마지막으로는 문제에 나와있는 기준대로 학점을 부여한다.

 

코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

string solution(vector<vector<int>> scores) {
    string answer = "";
    vector<int>sum(scores.size(), 0);
    vector<int>avg(scores.size(), 0);

    int y = 0, x = 0;
    for (x = 0; x < scores.size(); ++x) {
        int max_score = -1;
        int min_score = 101;
        for (y = 0; y < scores.size(); ++y) {
            if (y != x) {
                sum[x] += scores[y][x];
                max_score = max(max_score, scores[y][x]);
                min_score = min(min_score, scores[y][x]);
            }
        }
        if (scores[x][x]<min_score || scores[x][x]>max_score)
            avg[x] = sum[x] / (scores.size() - 1);
        else {
            sum[x] += scores[x][x];
            avg[x] = sum[x] / scores.size();
        }
    }

    for (x = 0; x < scores.size(); ++x) {
        if (avg[x] >= 90) answer.push_back('A');
        else if (avg[x] >= 80) answer.push_back('B');
        else if (avg[x] >= 70) answer.push_back('C');
        else if (avg[x] >= 50) answer.push_back('D');
        else answer.push_back('F');
    }

    return answer;
}