let answer = scores
// 배열 행 열 스왑
.map( (_, idx) => scores.map(score => score[idx]) )
알고리즘
각 학생들이 받은 점수는 배열의 열의 값이다. 즉 열의 값을 순회해야 한다.
전체 평균을 구하자,
만약 자기 자신을 평가한 점수가 유일한 최고점, 최저점이면 전체 평균에서 제거하자
아니라면 전체 평균을 그대로 반환해주자.
// 합
let sum = score.reduce((a,b) => a+b);
// 평균
let avg = sum / score.length;
// 자기 자신 평가 값
let selfScore = score.splice(idx, 1)[0];
if( selfScore < Math.min(...score) || selfScore > Math.max(...score)){
avg = ( sum - selfScore ) / score.length;
}
코드의 길이가 짧아서 좋다. 하지만. 가독성 부분에서 뛰어난 편이 아니다. 저 문자열이 의미하는 바가 없기 때문이다. 하지만 코드 길이면에서는 확실히 좋다.
구현
function solution(scores) {
let answer = scores
// 배열 행 열 스왑
.map( (_, idx) => scores.map(score => score[idx]) )
// 자기 자신 예외처리
.map( (score,idx) => {
let sum = score.reduce( (pre, cur) => pre + cur );
let avg = sum / score.length;
let selfScore = score.splice(idx, 1)[0];
// 자신이 평가한 점수가 비정상 적인 경우 제외
// 비정상적인 경우는 가장 유일하게 작은 값이거나, 큰 값인 경우.
if( selfScore > Math.max(...score) ||
selfScore < Math.min(...score)){
sum -= selfScore;
avg = sum / score.length;
}
return 'FFFFFDDCBA'[Math.floor(avg / 10)];
}).join('');
return answer;
}
정리 및 느낀점
이번 문제에서는 다양한 풀이가 존재하는데, 가능한 계산을 쉽게 하기 위해 배열을 변경해 주었다.