プログラマコード問題2021、08/24-Lv.1相互評価


[質問]


大学教授であるあなたは、相互評価を通じて学生たちに提出した宿題に加点したいと思っています.以下は、0~4番の5人の学生が自分と他の学生の宿題に対する採点表です.

上記の点数表では、i行j列の値は、i番学生が評価したj番学生の宿題点数である.
  • 0番生徒評価の点数は0番行中の[100,90,98,88,65]である.
  • 0番は100点、1番は90点、2番は98点、3番は88点、4番は65点.
  • 2番生徒評価の点数は2行目である[47,88,95,80,67].
  • 2番は0番が47点、1番が88点、自分が95点、3番が80点、4番が67点.
  • 学生ごとに得られる点数の平均値を求め、基準に従って単位を与えたいと思っています.
    学生が自分の点数が唯一の最高点または唯一の最低点であると評価した場合、それ以外は平均値を求める.
  • 0番生徒が獲得した点数は0番列の[100,50,47,61,24]である.自己評価の100点は自分が獲得した点数の中で唯一の最高点であり、平均を求める場合を除く.
  • 0番生徒の平均点は(50+47+61+24)/4=45.5.
  • 4番生徒が獲得した点数は4番列の[65,77,67,65,65]であった.自分の65点を評価するのは自分が得た点数の中で最低点だが、同じ点数はまだ2つあり、唯一の最低点ではない.したがって、平均値を求める場合は除外されません.
  • 4番生徒の平均点は(65+77+67+65+65)/5=67.8.
  • 除外する点数を除いて、平均点数を求め、以下の基準で単位を与えます.

    学生スコアを含む整数型2 D配列スコアをパラメータとします.このとき、解関数を完了し、学生の単位を求めて文字列にして返してください.
    せいげんじょうけん
  • 2≦点数の行の長さ(生徒数)≦10
  • 点数の列長=点数の行長度
  • つまり、分数は行と列の長さが等しい2次元配列である.
  • 0≦分数の元素≦100
  • 戻り値フォーマット
  • 0番学生の単位から順に接続された文字列を返します.
  • I/O例

    I/O例説明
    I/O例#1
    問題の例を以下に示します.
    I/O例#2
  • 1番学生自己評価の87点は[90,87]で唯一の最低点であり、平均を求める場合を除く.
  • I/O例#3
  • 1番学生の自己評価の50点は[49,50,31]の中で唯一の最高点であり、平均を求める場合を除く.
  • 2番生徒の自己評価の100点は[90,38100]で唯一の最高点であり、平均を求める場合を除く.
  • [回答]

    function solution(scores) {
      let answer = '';
       
      for(let i = 0, len = scores.length; i < len; i++) {
        const scoreArr = [];		// 학생별 점수 모음
        let self = scores[i][i];		// 자기 평가 점수
           
        for(let j = 0; j < len; j++) {
          scoreArr.push(scores[j][i]);
        }
           
        let min = Math.min(...scoreArr);	// 점수 중 최저점
        let max = Math.max(...scoreArr);	// 점수 중 최고점
        let sum = 0;			// 점수 합
        let count = scoreArr.filter(num => num === self).length;
        // 자기 평가 점수랑 같은게 몇 개인지 기록
           
        if((min === self || max === self) && (count === 1)) {
          const filterArr = scoreArr.filter(num => num !== self);
          sum = filterArr.reduce((acc, num) => acc += num, 0) / (len - 1);
        }
        else {
          sum = scoreArr.reduce((acc, num) => acc += num, 0) / len;
               
        }
        answer += checkGrade(sum);
      }
       
      return answer;
    }
    
    function checkGrade(num) {
      if(num >= 90) {
        return 'A';
      }
      else if(num >= 80) {
        return 'B';
      }
      else if(num >= 70) {
        return 'C';
      }
      else if(num >= 50) {
        return 'D';
      }
      else {
        return 'F';
      }
    }
    二重複文を用いて,1人の学生の点数だけを抽出して配列する.
    それらの点数の中で最高点と最低点を探し,これらの点数を自己評価点数と比較した.
    そして自己評価点数と同じ個数を求める.
    そして,条件文を用いて自己評価点数が最低か最高か,それにその点数が唯一の点数であることを加えて,自己評価点数を除いて平均する.
    上記条件を満たしていない場合は、すべての数字を平均し、最後に平均点に応じて等級を付けてanswerに順次追加する.