본문 바로가기
Web development/Algorithm

[프로그래머스] 상호 평가 (javascript)

by 자몬다 2021. 8. 20.

상호평가 방식으로 점수를 매기는데

자기 자신에게 준 점수가 받은 점수 중 유일한 최고점/최저점이면 제외하고 평균을 계산한다.

 

학생별로 받은 점수를 쉽게 계산할 수 있도록 배열을 뒤집는다.

(뭐.. i번 학생의 점수를 score[0~n][i]로 해도 되긴 하지만..)

 

그리고

1) 점수가 제외되지 않는 경우 그냥 총합/인원수를 구하면 된다.

2) 점수가 제외되는 경우 (총합-내가 준 점수)/인원수-1 하면 된다.

function solution(scores) {
    var answer = '';
    const s = [];
    
    // 학생별 점수가 될 수 있도록 배열 뒤집기
    for(let i in scores){
        for(let j in scores[i]){
            if(!s[j]) s.push([])
            s[j].push(scores[i][j])
        }
    }
    
    const av = [];
    for(let i in s){
        // 자기 점수와 최고점/최저점이 같고 최고점/최저점의 갯수가 1개면 제외해야 함
        let sum = 0;
        let members = s.length;
        if(Math.max(...s[i]) == s[i][i] && s[i].filter(sc=> sc==s[i][i]).length == 1) {
            // console.log(i, '학생은 유일한 최고점');
            sum -= s[i][i];
            members--;
        } else if(Math.min(...s[i]) == s[i][i] && s[i].filter(sc=> sc==s[i][i]).length == 1) {
            // console.log(i, '학생은 유일한 최저점')
            sum -= s[i][i];
            members--;
        }
        const result = s[i].reduce((acc, cur) => {
            return acc += cur;
        }, sum);
        av.push(result/members);
    }
    // console.log('평균',av);
    
    for(let i in av){
        answer += getGrade(av[i])
    }
    
    return answer;
}

function getGrade(score){
    if(score>=90){
        return 'A';
    }else if(score>=80){
        return 'B';
    } else if(score>=70){
        return 'C';
    } else if(score>=50){
        return 'D';
    } else {
        return 'F';
    }
}

 

풀어보러 가기 : https://programmers.co.kr/learn/courses/30/lessons/83201

댓글