[アルゴリズム回答]プログラマーSweekleChalleng 2週間-相互評価


プログラマーSweeklyChallengeの存在を忘れて、今日やっと解けました
問題の説明
大学教授であるあなたは、相互評価を通じて学生たちに提出した宿題に加点したいと思っています.以下は、0~4番の5人の学生が自分と他の学生の宿題に対する採点表です.
No.01234009098886515045998577788958073615710080654249047565平均45.581.2597.281.667.8単位FBABD
上記の点数表では、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.
    除外する点数を除いて、平均点数を求め、以下の基準で単位を与えます.
  • 平均単位90点以上A 80点以上90点未満B 70点以上80点未満C 50点以上70点未満D 50点F
    学生スコアを含む整数型2 D配列スコアをパラメータとします.このとき、解関数を完了し、学生の単位を求めて文字列にして返してください.
    せいげんじょうけん
  • 2≦点数の行の長さ(生徒数)≦10
  • 分数の列長=分数の行長
  • つまり、分数は行と列の長さが等しい2次元配列である.
  • 0≦分数の元素≦100
  • 戻り値フォーマット
  • 0番学生の単位から順に接続された文字列を返します.
  • I/O例
    scoresresult[[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"
    解答方法
    単純に平均を求める問題では,自分の点数が唯一の最大値であるか最小値であるかを判断することで一次分岐処理を行う問題である.
    最大値と最小値を知る必要があるので、ソートしたほうがいいです.行がi学生が得た点数であれば並べ替えが可能であり,列はi学生が得た点数であるため,マトリクスシフトを先に行う.
    その後、複文で各学生の単位を求める過程は以下の通りである.
  • 自分が与えた点数を保存する.
  • 生徒が獲得した点数を並べ替える.
  • 生徒の得点の合計を求める.
  • 自分が与えた点数が最大または最小であれば、同じ点数がないか判断する.
  • 最大値と最小値のどちらが揃えられているかは、自分が与えた値が最初の要素なのか最後の要素なのかで知ることができます.
  • 同じスコアにはシーケンスがあり、最初の2つの要素または最後の2つの要素が同じかどうかで判断できます.△同じ要素がどれだけあるかは関係ありません.
  • 4回の判断結果から、自分の点数を除外するなら、自分の点数を外して平均を求め、そうでなければ全体の平均を求める.
  • 5回で求めた平均値を利用し、与えられた基準で単位を求め、リングに貼り付ける.
  • すべての学生に対して上記のコースを繰り返し、最終結果を返します.
    コード#コード#
    import java.util.Arrays;
    
    class Solution {
        static int size;
    
        public static int[][] transpose(int[][] scores){
            int[][] result = new int[size][size];
            for(int i=0; i<size; i++){
                for(int j=0; j<size; j++){
                    result[i][j] = scores[j][i];
                }
            }
            return result;
        }
    
        public static String getGrade(double score){
            String result;
            if(score >= 90) result = "A";
            else if(score >= 80) result = "B";
            else if(score >= 70) result = "C";
            else if(score >= 50) result = "D";
            else result = "F";
            return result;
        }
    
        public String solution(int[][] scores) {
            StringBuilder answer = new StringBuilder();
            size = scores.length;
            scores = transpose(scores);
            int myScore, sum, mean;
            for(int i=0; i<size; i++){
                myScore = scores[i][i];
                Arrays.sort(scores[i]);
                sum = 0;
                for(int j=0; j<size; j++) sum+= scores[i][j];
                if((myScore == scores[i][0] && scores[i][0] != scores[i][1]) || (myScore == scores[i][size-1] && scores[i][size-1] != scores[i][size-2])){
                    mean = (sum-myScore)/(size-1);
                }
                else mean = sum/size;
                answer.append(getGrade(mean));
            }
            return answer.toString();
        }
    }