프로그래머스(Programmers)
상호 평가
cosmohoo
2021. 9. 9. 22:36
반응형


제한사항
- 2 ≤ scores의 행의 길이(학생 수) ≤ 10
- scores의 열의 길이 = scores의 행의 길이
- 즉, scores는 행과 열의 길이가 같은 2차원 배열입니다.
- 0 ≤ scores의 원소 ≤ 100
- return 값 형식
- 0번 학생의 학점부터 차례대로 이어 붙인 하나의 문자열을 return 합니다.
입출력 예
scores result
| [[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" |
| [[50,90],[50,87]] | "DA" |
| [[70,49,90],[68,50,38],[73,31,100]] | "CFD" |
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
char getGrade(int tmp )
{
char answer;
if(tmp>= 90) answer= 'A';
else if(tmp <90 && tmp >= 80) answer ='B';
else if(tmp <80 && tmp >= 70) answer ='C';
else if(tmp <70 && tmp >= 50) answer ='D';
else answer ='F';
return answer;
}
string solution(vector<vector<int>> scores) {
string answer = "";
int sum=0;// 점수합
double avg;// 평균
int high=0;//최고
int low=100; //최저
int self; //본인점수
int cnt=0;
int limit = scores.size();
int low_cnt=0;
int high_cnt=0;
for(int i=0; i<limit; i++)
{
for(int j=0; j< limit; j++)
{
if(scores[j][i] >= high)
{
high = scores[j][i];
}
if(scores[j][i] <= low)
{
low = scores[j][i];
}
if(j == i)
{
self = scores[j][j];
}
sum += scores[j][i];
}
for(int k=0; k<limit; k++)
{
if(scores[k][i] == low)
{
low_cnt++;
}
if(scores[k][i] == high)
{
high_cnt++;
}
}
if((self == high && high_cnt<2) || (self == low && low_cnt<2)) //최고점 혹은 최저점이 본인이 부여한 점수이며 해당 점수가 중복되지 않은경우
{
sum -= self;
avg = (double)sum /(double)(limit-1);
}
else
{
avg= (double)sum / (double)limit;
}
char tmp = getGrade(avg);
answer.push_back(tmp);
high=0; low=100; sum=0;//변수 사용후 초기화
high_cnt =0; low_cnt=0;
}
return answer;
}
=> 본인이 본인에게 부여한 점수가 최고점 혹은 최저점에 속하는지 확인하여야한다.
=> 위의 사항에 해당한다하더라도 최고점 혹은 최저점의 갯수가 복수일 경우 해당 점수는 무시하지 않고 계산에 넣어야합니다. (본인은 이 요구사항을 보지 못해 한동안 헤매 회사동기의 도움을 받았습니다😭.)
=> 이중 벡터이지만 2차원배열로 생각하면 됩니다.
=> 본인이 받은 점수가 행이 아닌 열라는 것을 염두에 둬야합니다. (세로 O , 가로 X)
=> 평균을 내야하므로 double형을 사용하여 결과값을 구해야합니다.

반응형